De toute évidence, vous ne pouvez pas avoir une instance de type void
dans un programme bien formé, donc quelque chose comme la déclaration suivante ne compilera pas:Type Void dans std :: tuple
std::tuple<void, double, int> tup;
Cependant, Tant que nous traitons strictement des types par opposition aux objets, il ne semble pas y avoir de problème. Par exemple, mon compilateur (GCC) me permet de dire:
typedef std::tuple<void, double, int> tuple_type;
Cela me est intéressant, parce qu'il semble que, avec C++ 0x nous pouvons simplement utiliser std::tuple
pour effectuer beaucoup de tours de méta-programmation qui plus tôt aurait eu besoin de la bibliothèque boost::mpl
. Par exemple, nous pouvons utiliser std::tuple
pour créer un vecteur de types.
Par exemple, supposons que nous voulons créer un vecteur de types représentant une signature de fonction:
Nous pouvons simplement dire:
template <class R, class... Args>
struct get_function_signature;
template <class R, class... Args>
struct get_function_signature<R(*)(Args...)>
{
typedef std::tuple<R, Args...> type;
};
Cela semble fonctionner, même si la signature de la fonction a un void
type, tant que nous n'instancions jamais réellement une instance de get_function_signature<F>::type
.
Cependant, C++ 0x est encore nouveau pour moi, et bien sûr toutes les implémentations sont encore un peu expérimentales, donc je suis un peu inquiet à ce sujet. Peut-on vraiment utiliser std::tuple
comme vecteur de types pour la méta-programmation?
Je m'attends à ce que 'boost :: mpl :: vector' soit déprécié. Quoi qu'il en soit, la plus grande partie de la fonctionnalité boost :: mpl' et de la métaprogrammation de modèles en général changera considérablement lorsque le support des modèles variés augmentera. –