実際には、再帰を終了するための非常にエレガントな方法があります:
template <typename Last>
std::string type_name () {
return std::string(typeid(Last).name());
}
template <typename First, typename Second, typename ...Rest>
std::string type_name () {
return std::string(typeid(First).name()) + " " + type_name<Second, Rest...>();
}
私は最初に試しtemplate <typename Last>
てみtemplate <typename First, typename ...Rest>
ましたが、それはあいまいであると見なされました(残りはゼロ要素にすることができます)。この質問は、決定的な解決策を示してくれました:再帰的な可変個引数テンプレート関数のコンパイルエラー
コードの重複を避けるために、次のようにすることもできます。
template <typename Last>
std::string type_name () {
return std::string(typeid(Last).name());
}
template <typename First, typename Second, typename ...Rest>
std::string type_name () {
return type_name<First>() + " " + type_name<Second, Rest...>();
}