2011-07-04 8 views
5

? Es posible escribir una función que toma un tipo y devuelve un tipo (relacionado). Por ejemplo, una función que toma un tipo llamado "RandomVariable" y devuelve un tipo llamado "RandomVariableCovariance". Supongo que, en general, la pregunta es si typenames pueden ser parámetros o tipos de devolución. C++ 0x está bien.¿Se puede escribir una función que toma un tipo y devuelve un tipo diferente

+3

Di lo que quieras resolver, tal vez podamos encontrar una buena idea de diseño. –

+0

Debe aclarar: ¿desea una función que * manipule tipos * (es decir, tome como parámetro el * tipo * 'RandomVariable' y devuelva el tipo' RandomVariableCovariance') o algún tipo de función de plantilla que determine su tipo de devolución del tipo de uno de sus argumentos? –

+0

Para una variable aleatoria, su media es del mismo tipo que sus realizaciones (por lo que es fácil escribir una interfaz dentro de una clase que tiene su tipo subyacente como un parámetro de plantilla) pero su covarianza es un tipo diferente (que está relacionado pero de una manera no trivial). Si la variable aleatoria es un vector de elemento N (digamos un tipo de vector ublas), entonces la covarianza de esa variable aleatoria será una matriz de elemento N x N (digamos un tipo de matriz ublas). Me gustaría no tener que hacer que la clase especifique explícitamente el tipo de su covarianza, pero ser capaz de inferirlo desde su realización. Puedo publicar código de muestra si es útil. – bpw1621

Respuesta

11

Usted no puede hacerlo con las funciones, pero se puede hacer con especializaciones de plantilla. Por ejemplo

template <class T> 
struct ConvertType; 

template <> 
struct ConvertType<RandomVariable> 
{ 
    typedef RandomVariableCovariance type; 
}; 

int main() 
{ 
    ConvertType<RandomVariable>::type myVar; 
} 

define un tipo ConvertType que está especializada para convertir RandomVariable-RandomVariableCovariance. Es posible hacer todo tipo de selección de tipos inteligentes de esta manera dependiendo de lo que necesite.

+0

He olvidado por completo tu respuesta ...: P +1. – Xeo

2

Los nombres de tipos no pueden ser parámetros o valores devueltos de una función; los tipos son una cosa de tiempo de compilación!

+0

Esto es C++ 0x; es posible allí. –

+0

@Nicol: C++ 0x está más allá de lo que sé! Si escribe una respuesta que describa esto, entonces eliminaré el mío ... –

+0

@Nicol: su respuesta no es manipular tipos (o nombres de tipos) en tiempo de ejecución, que es lo que implica la pregunta del OP ... –

-2

Pardon mi horrible, C, ya que ha sido siempre desde que en realidad trabajaba con él:

typedef int RandomVariable; 
typedef float RandomVariableCovariance; 

RandomVariableCovariance myFunc(RandomVariable x) { 
    .... 
} 
+0

Creo que esto no tiene sentido; mi interpretación de la pregunta del OP es un deseo de devolver realmente un tipo; es decir, manipular tipos en tiempo de ejecución! –

+0

oh. así que, básicamente, hacer algo así como una "variable variable" en c? aterrador ... muy, muy aterrador. –

+0

Así es como leo la pregunta del OP. Si no, ¡entonces está siendo terriblemente claro! –

0

Esto estaba en la larga lista de cosas para C++ 0x. Es por eso que crearon este extraño formato de definición de función:

auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...} 

que, combinado con decltype, le permite hacer cosas como esta:

auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...} 

Esto significa que el tipo de retorno será lo que se obtiene cuando llama al operador + (Tipo1, Tipo2).

Tenga en cuenta que C++ es un lenguaje estáticamente tipado. No puede hacer cálculos de tipo en tiempo de ejecución. Debe hacerse en tiempo de compilación, a través de mecanismos como este o alguna forma de metaprogramación de plantillas.

+0

Todavía es una característica de generación de código de ** tiempo de compilación **, así que no es realmente "tomar un tipo como argumento". –

+2

Solo puede hacer cálculos de tipo en tiempo de compilación. El compilador realiza todas las metaprogramaciones de plantillas y cálculos basados ​​en tipos. C++ es un lenguaje _statically_ tipado; la tipificación en tiempo de ejecución no es posible. –

+1

sí, por supuesto, solo quería asegurarme de que el OP sea consciente de eso. Aclamaciones. –

Cuestiones relacionadas