我在递归模板包解压缩时遇到麻烦。我目前拥有的是:
template<T>
constexpr void register_types() {
do_something<T>();
return;
}
template <class T, T2, class... Args>
constexpr void register_types() {
do_something<T>();
register_types<T2, Args...>();
}
int main(int argc, char** argv) {
register_types<unsigned char, unsigned short, unsigned int, unsigned long long int>();
但是我希望有一个更空的基本情况,例如
template<>
constexpr void register_types() {
return;
}
template <class T, class... Args>
constexpr void register_types() {
do_something<T>();
register_types<Args...>();
}
但是这给了我错误:
src/benchmarks/benchmark_main.cc:68:31: error: ‘register_types’ is not a template function
是否有一个空的参数包作为基本情况?我见过this post,但希望避免使用SFINAE。
答案 0 :(得分:5)
是否可以将空的参数包作为基本情况?
没有模板参数就不能声明模板函数。
但是您可以声明一个模板函数,该函数接受模板参数的空列表(使用默认值/类型或变量)。
对于您的病例建议:尝试
template <int = 0>
constexpr void register_types() {
return;
}
template <class T, class... Args>
constexpr void register_types() {
do_something<T>();
register_types<Args...>();
}
这样,基础案例(第一个案例)是一个常规模板函数,它接受零模板参数(由于默认值)。
如果Args...
不为空,则接受整数而不是类型不会给您带来冲突问题。
答案 1 :(得分:2)
是的,您可以编写一个空的基本案例来终止递归(尽管您仍然需要模板参数)。
但是,如果您只使用fold-expression,则可以避免自己实现任何一个:
template <class ...Ts>
constexpr void register_types() {
(do_something<Ts>(), ...);
}
这里是demo。
答案 2 :(得分:0)
否,您不能使用空的模板参数。如果您的情况有所帮助,我不会。您可以使用一个类来存储多个函数的类型名称。