récursive variadic template pour imprimer le contenu d'un paramètre pack
Comment est-il possible de créer un circuit variadic template pour imprimer le contenu d'un paramater pack?
Je suis en train d'essayer avec cela, mais il ne parvient pas à compiler:
template <typename First, typename ...Args>
std::string type_name () {
return std::string(typeid(First).name()) + " " + type_name<Args...>();
}
std::string type_name () {
return "";
}
Comment puis-je mettre fin à la récursivité?
Vous devez vous connecter pour publier un commentaire.
Vous avez besoin pour l'utilisation partielle de la spécialisation à la fin de la récursivité, mais puisque vous ne pouvez pas partiellement spécialiser libre les fonctions en C++, vous devez créer une classe d'implémentation d'une fonction membre statique.
Que la première déclaration de
Impl
est juste une solution de contournement pour un défaut dans g++ 4.6 (et ci-dessous). Il ne sera pas nécessaire une fois qu'il met en œuvre variadic templates correctement.Check it out dans l'action au ideone.com
Il y a en fait un moyen très élégant à la fin de la récursivité:
J'ai d'abord essayé
template <typename Last>
ettemplate <typename First, typename ...Rest>
mais qui a été jugée ambiguë (le Reste peut être égal à zéro les éléments). Cette question m'a montré la solution définitive: Erreur de Compilation sur Récursive Variadic Template de FonctionNote, pour éviter un peu de la duplication de code, vous pouvez aussi faire:
Comme une alternative à la non-existant partielle de la spécialisation des fonctions, vous pouvez utiliser la surcharge sur un typifier classe:
Comme alternative, vous pouvez décompresser le paramètre pack en place, comme dans l'exemple suivant:
La récursivité n'est pas nécessaire en fait de le faire.
constexpr
déclaration de fonction (VS2015 mise à Jour 3). Toutes les compiler, si elle sera supprimée/std:c++latest
, c'est à dire prend en chargeC++17
. Les erreurs sont:Error C3250 'str': declaration is not allowed in 'constexpr' function body
etError C3250 'arr': declaration is not allowed in 'constexpr' function body