2011-12-13 18 views
6

Quiero comprobar si un argumento de plantilla es de tipo de referencia o no en C++ 03. (Ya tenemos is_reference en C++ 11 y Boost).Comprobando si un argumento de plantilla es una referencia [C++ 03]

Hice uso de SFINAE y el hecho de que no podemos tener un puntero a una referencia.

Aquí está mi solución

#include <iostream> 
template<typename T> 
class IsReference { 
    private: 
    typedef char One; 
    typedef struct { char a[2]; } Two; 
    template<typename C> static One test(C*); 
    template<typename C> static Two test(...); 
    public: 
    enum { val = sizeof(IsReference<T>::template test<T>(0)) == 1 }; 
    enum { result = !val }; 

}; 

int main() 
{ 
    std::cout<< IsReference<int&>::result; // outputs 1 
    std::cout<< IsReference<int>::result; // outputs 0 
} 

Cualquier cuestión con ella? ¿Alguien puede proporcionarme una mejor solución? Hace

+1

Para completar puede añadir los casos de prueba de puntero de referencia, es decir, 'IsReference :: result'. – iammilind

Respuesta

7

años, escribí esto:

//! compile-time boolean type 
template< bool b > 
struct bool_ { 
    enum { result = b!=0 }; 
    typedef bool_ result_t; 
}; 

template< typename T > 
struct is_reference : bool_<false> {}; 

template< typename T > 
struct is_reference<T&> : bool_<true> {}; 

A mí me parece más simple que su solución.

Sin embargo, solo se ha usado algunas veces y puede que falte algo.

+0

Quería evitar la especialización. Sigue siendo una buena solución. Ya votado. –

+0

@PrasoonSaurav: evitar para el aprendizaje? – GManNickG

+0

@GMan: Debido a alguna razón * desconocida * no puedo especializar esta clase: P [Esto es solo para fines de aprendizaje y no tiene nada que ver con el código del mundo real]. –

15

Usted puede hacer esto mucho más fácil:

template <typename T> struct IsRef { 
    static bool const result = false; 
}; 
template <typename T> struct IsRef<T&> { 
    static bool const result = true; 
}; 
+0

+1 por simplicidad. –

+0

¿Hay alguna manera de hacer lo mismo sin especializar la clase? –

+0

@PrasoonSaurav, esta solución proporciona una manera muy simple de SFINAE, ¿cuál es el problema con la especialización, cuando garantiza el resultado correcto? De hecho, puede ampliar esta solución para [referencia de valor r en C++ 11] (http://www.ideone.com/JHThh). – iammilind

Cuestiones relacionadas