递归模板包

Thr*_*ton 0 c++ parameters templates

我在递归模板包解包方面遇到了麻烦。我目前拥有的是:

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>();
Run Code Online (Sandbox Code Playgroud)

但是我想要一个更空的基本案例,比如

template<> 
constexpr void register_types() {
    return;
}

template <class T, class... Args> 
constexpr void register_types() {
    do_something<T>();
    register_types<Args...>();
}
Run Code Online (Sandbox Code Playgroud)

但是,这给了我错误:

src/benchmarks/benchmark_main.cc:68:31: error: ‘register_types’ is not a template function

是否可以将空参数包作为基本情况?我看过这篇文章,但希望尽可能避免使用 SFINAE。

max*_*x66 5

是否可以将空参数包作为基本情况?

您不能声明没有模板参数的模板函数。

但是您可以声明一个模板函数,该函数接受模板参数的空列表(使用默认值/类型或可变参数)。

对于您的案例建议:尝试使用

template <int = 0> 
constexpr void register_types() {
    return;
}

template <class T, class... Args> 
constexpr void register_types() {
    do_something<T>();
    register_types<Args...>();
}
Run Code Online (Sandbox Code Playgroud)

这样,地面案例(第一个)是一个常规模板函数,它接受零模板参数(感谢默认值)。

接受整数而不是类型,当Args...不为空时不会给您带来冲突问题。