2011-06-14 22 views
10

esta pregunta está relacionada con C++¿Son posibles los typedef condicionales en C++?

hay una biblioteca que declara una clase llamada Solver < TS, FS>. Solver es un miembro de otra clase de dominio (escrito por mí)

Ahora hay muchos dominios que tienen una "región int" miembro de

lo que quiero hacer es en función del valor de la región, quiero hacer que el solucionador acepte diferentes argumentos para TS y FS. Estaba pensando en algo a lo largo de la línea

template<int region> 
struct Decider 
{ 
    if(region==1) 
    { 
    typedef TSA TS; 
    typedef FSA FS; 
    } 
    else 
    if(region==2) 
    { 
    typedef TSB TS; 
    typedef FSB FS; 
    } 
} 

y luego usarlo como

Decider<region>::TS 
Decider<region>::FS 

Sin embargo, aquí debido al alcance del caso, supongo que la estructura es inútil. Sin embargo, no puedo pensar en un mejor método para hacer esto. ¿Alguna sugerencia?

Todos los diferentes TS y FS tienen la misma interfaz. Entonces no tengo que preocuparme por el código interno.

Respuesta

15

puede especializarse una plantilla para cualquier valor region.

template<int region> 
struct Decider; 

template<> 
struct Decider<1> 
{ 
    typedef TSA TS; 
    typedef FSA FS; 
}; 

template<> 
struct Decider<2> 
{ 
    typedef TSB TS; 
    typedef FSB FS; 
}; 
+0

Debe tenerse en cuenta que el argumento de la plantilla debe ser una constante en tiempo de compilación. Como el OP dijo que quería usar una variable miembro 'int region' como argumento, me temo que esta solución no satisfará sus necesidades ... (Es posible que haya entendido mal la pregunta, por supuesto) –

+0

sí ... sería preferible tenerlo como región int pero supongo que puedo administrarlo con una constante de tiempo de compilación tooo. simplemente hará que el código sea más largo, supongo ....... –

+0

solo para asegurarme de que puedo hacer esto ¿no? 'usando Decider :: TS; Solver solver(); ' –

9

Necesita especialización en plantillas.

template <int region> 
struct Decider; 

template <> 
struct Decider<1> 
{ 
    typedef TSA TS; 
    typedef FSA FS; 
}; 

template <> 
struct Decider<2> 
{ 
    typedef TSB TS; 
    typedef FSB FS; 
}; 

C++ se elegir la versión a utilizar en función de la region suministrado.

Puede, por supuesto, extender esto como lo considere adecuado para otros números de región.

+0

supongamos que quiero una definición para region = 1 y otra definición para region! = 1 entonces, ¿es posible? –

5

Si tiene que parametrizar Decider basado en una constante, puede utilizar especialización de plantilla en tiempo de compilación (ver otras respuestas).

Si necesita parametrizar Decider basándose en un valor de tiempo de ejecución de region, también debe posponer la parametrización en el tiempo de ejecución. Por lo general, esto se hace a través de algún tipo de función de creación o idioma de fábrica.

+0

gracias ..... Voy a investigar eso ... –

+0

miré en el método de fábrica ... creo que voy a ir con eso ... muchas gracias ... –

2

Nota para cualquiera que venga a través de esto ahora:

También es posible hacer esto con las bibliotecas Boost utilizando el type_trait boost::conditional.

typedef boost::conditional<condition, type_if_true, type_if_false> MyTypeDef; 

condition todavía es necesario que haya una expresión de tiempo de compilación que se evalúa como verdadera o falsa. Esto también lo hace para que no necesites especializarte en toda tu clase por solo unas pocas líneas de diferencias.

+0

Es realmente maldito ¡¡increíble!! :-) –