再帰を終了するには非常にエレガントな方法は実際にあります:
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>
を試しましたが、それはあいまいであると考えられました(残りはゼロ要素)。あなたも行うことができ、コードの重複のビットを避けるためにCompilation Error on Recursive Variadic Template Function
注::
代替として
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...>();
}
あなたが引用回避策リンクが死んでいます。あなたはバグのないg ++なしでこれを行うための正しい方法を精緻化できますか? – cdhowie
この答えが正しいですが、これの回避策は、Mac – Gerard
にクランのためにも必要である、それは時代遅れです。より簡単なアプローチが可能です。他の回答を参照してください。 – Johannes