c++ - 默认参数模板与可变参数模板 : what is the last template parameter?

标签 c++ templates c++11 variadic-templates

我有点困惑,因为默认参数模板和可变参数模板参数都必须是模板的最后一个参数。那么我的函数的良好官方语法是什么?

template<typename T, class T2 = double, unsigned int... TDIM> myFunction(/* SOMETHING */)

template<typename T, unsigned int... TDIM, class T2 = double> myFunction(/* SOMETHING */)

最佳答案

实际上,模板参数包和默认参数没有是函数中的最后一个,如果它之后的任何内容将被推断(或默认):

template<class T, class... Args, class T2 = int, class T3>
void f(T3){}

请注意,您永远不能为 T2 指定任何内容,因为所有内容都将被可变参数包吞噬。由此得出结论,如果要手动指定可变参数包,则将可变参数包放在默认参数之后是有意义的。对于演绎的包,它更像是一种风格选择,我个人会将它们放在最后。

请注意,如果它们是作为另一个模板的一部分推导出来的,您甚至可以有多个可变参数包:

template<class...> struct pack{};

template<class T, class... P1, class... P2, class T2>
void f(pack<P1...>, pack<P2...>, T2){}

在这种情况下,我会将包和其他模板参数相对于它们的函数参数放置,即以相同的顺序。

对于(主)类模板,这当然是不同的,因为不能推导出参数。事实上,可变参数包必须在模板参数列表的末尾:

template<class T, class... Args, class T2=int>
struct X{}; // error

对于部分特化,顺序无关紧要,这又是一个纯粹的风格选择。我个人会将它们与主模板的参数相关联,就像以前一样。

template<class T1, class T2>
struct X{};

template<template<class...> class T1, class... A1,
    template<class...> class T2, class... A2>
struct X<T1<A1...>, T2<A2...>>{};

关于c++ - 默认参数模板与可变参数模板 : what is the last template parameter?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11900001/

相关文章:

ruby - 在哪里可以找到 Rails API rdoc 模板

c++ - const char* 作为模板的参数

c++ - 获取回调函数的返回类型

c++ - std::conditional 编译时分支评估

c++ - 在 Visual STUDIO : error C2664: '_chmod' : cannot convert parameter 1 from 'wchar_t [260]' to 'const char *' 中获取错误

c++ - 卷积 : the last element in the convolution is never right

templates - 使用 Spring Roo 修改生成的 View 的外观,而无需在创建后手动更改每个 View ?

c++ - 使用子目录中的包含内容构建 Scons

c++ - 让 GCC 在 C++11 模式下在 FreeBSD 上工作

c++ - 如果中间有线程连接,为什么不能使用宽松的原子操作来同步内存?