递归模板包

时间:2020-06-25 14:08:56

标签: c++ templates parameters

我在递归模板包解压缩时遇到麻烦。我目前拥有的是:

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。

3 个答案:

答案 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)

否,您不能使用空的模板参数。如果您的情况有所帮助,我不会。您可以使用一个类来存储多个函数的类型名称。

相关问题