Est-il possible d'écrire une fonction qui prend un type et renvoie un type (connexe). Par exemple, une fonction qui prend un type appelé "RandomVariable" et retourne un type appelé "RandomVariableCovariance". Je suppose qu'en général, la question est de savoir si les noms de type peuvent être des paramètres ou des types de retour. C++0x est bien.
Réponses
Trop de publicités?On ne peut pas le faire avec des fonctions, mais on peut le faire avec des spécialisations de modèles. Par exemple, les
template <class T>
struct ConvertType;
template <>
struct ConvertType<RandomVariable>
{
typedef RandomVariableCovariance type;
};
int main()
{
ConvertType<RandomVariable>::type myVar;
}
Définit un type ConvertType
qui est spécialisé dans la conversion de RandomVariable
a RandomVariableCovariance
. Il est possible d'effectuer toutes sortes de sélections intelligentes de cette manière, en fonction de vos besoins.
Cela faisait partie de la longue liste de choses à faire pour C++0x. C'est pourquoi ils ont créé cet étrange format de définition de fonction :
auto FuncName(Type1 param1, Type2 param2) -> ReturnType {...}
Combiné au decltype, il permet de faire des choses comme celles-ci :
auto FuncName(Type1 param1, Type2 param2) -> decltype(param1 + param2) {...}
Cela signifie que le type de retour sera celui que vous obtiendrez en appelant operator+(Type1, Type2).
Notez que le C++ est un langage à typage statique. Il n'est pas possible d'effectuer des calculs de type au moment de l'exécution. Cela doit être fait au moment de la compilation, via des mécanismes comme celui-ci ou une forme de métaprogrammation de gabarit.