2010-06-09 14 views
5

Estoy seguro de que boost tiene algunas funciones para hacer esto, pero no conozco suficientemente las bibliotecas relevantes. Tengo una clase de plantilla, que es bastante básica, excepto por un giro en el que necesito definir un tipo condicional. Aquí está el código de psuedo para lo que quieroDefiniciones de tipo condicional

struct PlaceHolder {}; 
    template <typename T> 
class C{ 
    typedef (T == PlaceHolder ? void : T) usefulType; 
}; 

¿Cómo escribo ese tipo condicional?

+0

interesante. ¿Bajo qué circunstancias sería esto útil? Puede dar un ejemplo. – Stephen

+0

Aquí estaba mi ejemplo. Para uno, los argumentos de plantilla, digamos TYPE, que tienen el valor PlaceHolder significa "desactivar alguna característica". Hay un conjunto de devoluciones de llamadas que tienen el tipo de retorno TYPE * que el significado natural de desactivar la característica es que las devoluciones de llamada tengan el tipo de retorno void. usefulType es el valor de retorno para las devoluciones de llamada. –

+0

@pythonicmetaphor ¿podría cambiar la respuesta aceptada? Los tiempos son diferentes ahora – Ven

Respuesta

8

También con el nuevo estándar:

typedef typename std::conditional<std::is_same<T, PlaceHolder>::value, void, T>::type usefulType

+1

Esto debería ser el más aceptado. –

2
template < typename T > 
struct my_mfun : boost::mpl::if_ 
< 
    boost::is_same<T,PlaceHolder> 
, void 
, T 
> {}; 

template < typename T > 
struct C { typedef typename my_mfun<T>::type usefulType; }; 
+0

El código debe tener un prefijo de 4 espacios. Puede seleccionar texto y hacer clic en el botón 101010 para hacerlo a granel. – GManNickG

+0

Gracias, pero por favor no altere mis respuestas. –

+7

Consulte las preguntas frecuentes: "Si no se siente cómodo con la idea de que sus preguntas y respuestas sean editadas por otros usuarios de confianza, este puede no ser el sitio para usted". – Bill

6

creo que este es el principio de lo que busca:

template< class T > 
struct DefineMyTpe 
{ 
    typedef T usefulType; 
}; 

template<> 
struct DefineMyType<PlaceHolder> 
{ 
    typedef void usefulType; 
}; 

template< class T > 
class C 
{ 
    typedef typename DefineMyType<T>::usefulType usefulType; 
}; 
+1

Esta no debería ser la respuesta aceptada en 2015. – Ven

+1

No debería, pero no puedo cambiarlo. Recién votando el que usa std :: conditional, cualquier usuario de SO probablemente será lo suficientemente inteligente como para considerar la respuesta más votada. – stijn

+1

Agregue un "ver la respuesta posterior de @rafak" o algo así, para que las personas sepan buscarlo por adelantado. – Ven

Cuestiones relacionadas