? 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
Respuesta
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.
He olvidado por completo tu respuesta ...: P +1. – Xeo
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!
Esto es C++ 0x; es posible allí. –
@Nicol: C++ 0x está más allá de lo que sé! Si escribe una respuesta que describa esto, entonces eliminaré el mío ... –
@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 ... –
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) {
....
}
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! –
oh. así que, básicamente, hacer algo así como una "variable variable" en c? aterrador ... muy, muy aterrador. –
Así es como leo la pregunta del OP. Si no, ¡entonces está siendo terriblemente claro! –
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.
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". –
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. –
sí, por supuesto, solo quería asegurarme de que el OP sea consciente de eso. Aclamaciones. –
- 1. de funciones, que genéricamente toma un tipo y devuelve el mismo tipo
- 2. ¿Se puede convertir un puntero a una función de un tipo en una función de otro tipo que toma argumentos adicionales?
- 3. ¿Cómo puedo escribir un puntero de función que toma una función de su propio tipo como argumento?
- 4. Haskell función que toma un tipo y un valor y comprueba si el valor tiene ese tipo
- 5. Herencia: ¿Función que devuelve el tipo propio?
- 6. Función que toma un iterador STL sobre CUALQUIER contenedor de elementos de un tipo específico
- 7. ¿Cómo se define un tipo para una función en Scala?
- 8. ¿Puede un tipo ser un tipo de referencia y un tipo de valor al mismo tiempo?
- 9. ¿Se puede especificar en una restricción de tipo genérico que debe implementar un tipo genérico?
- 10. Proporcionar un cuerpo de función diferente para una función genérica basada en el tipo
- 11. Configurar Unity para resolver un tipo que toma una dependencia decorada que tiene un parámetro que varía con el tipo en el que se inyecta
- 12. ILGenerator.DeclareLocal() toma un tipo de una clase aún no compilada
- 13. ¿Se puede pasar un "tipo" como argumento?
- 14. Un tipo diferente de ordenable de jquery
- 15. ¿Se devuelve un operador o una función?
- 16. ¿Cómo se define un método en Scala que devuelve un tipo?
- 17. ¿Cómo escribir un método zipWith que devuelve el mismo tipo de colección que los que se le pasaron?
- 18. Escribir un mejor tipo natural, (que la mía)
- 19. ¿Cómo se puede obtener el tamaño de un tipo para el que se tiene una codificación?
- 20. ¿Cómo crear una función Haskell que introduzca un nuevo tipo?
- 21. ¿Puede un tipo anónimo heredar de otro tipo?
- 22. anular una función miembro con diferente tipo de retorno
- 23. ¿Cuál es la forma correcta de python para escribir métodos que solo toman un tipo particular?
- 24. Escribir una función Sass/Scss que devuelve una cadena
- 25. Función que devuelve una expresión lambda
- 26. ¿Es posible escribir un tipo de función de puntero a externo? "C" dentro de una plantilla?
- 27. ¿Cómo se puede convertir a un tipo usando el nombre del tipo como una cadena?
- 28. Redefinición de un tipo diferente de símbolo
- 29. función que devuelve un tipo genérico cuyo valor es conocido sólo en tiempo de ejecución
- 30. ¿GCC alineará una función que toma un puntero?
Di lo que quieras resolver, tal vez podamos encontrar una buena idea de diseño. –
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? –
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