5 votes

Peut-on écrire une fonction qui prend un type et retourne un autre type ?

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.

11voto

Node Points 2259

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.

2voto

Oli Charlesworth Points 148744

Les noms de type ne peuvent pas être des paramètres ou des valeurs de retour d'une fonction ; les types sont une chose qui relève de la compilation !

0voto

Nicol Bolas Points 133791

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.

-2voto

Marc B Points 195501

Pardonnez mon horrible C, car cela fait une éternité que je n'ai pas travaillé avec :

typedef int RandomVariable;
typedef float RandomVariableCovariance;

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X