模板参数包如何具有其他尾随参数?
How can a template parameter pack have other trailing arguments?
在C++14标准草案中,[temp.param]/11说:
如果是主类模板或别名模板的模板参数 是一个模板参数包,它应该是最后一个模板参数。
如果您尝试编译以下模板,则编译器将抱怨。
template< typename ...Args, void(*f)(Args...) > // ERROR
struct Bar
{};
但是在这种情况下它是如何工作的呢?
template< typename F, F >
struct Bar;
template< typename ...Args, void(*f)(Args...) > // OK ???
struct Bar< void(*)(Args...), f >
{};
我可以看到它与它是专业化类模板的一部分有关,但为什么呢?
该规则明确指出它适用于主类模板。这是否意味着专业化的规则会发生变化?
我试图在标准中搜索这个,但找不到任何东西。你能不能对此有所了解。
该规则明确指出它适用于主类模板。这是否意味着专业化的规则会发生变化?
是的。很简单,因为专业化不是主要类模板。因此,如果措辞旨在适用于所有模板声明,它将这样说。相反,该规则非常适用于主类模板(...和别名模板,不能专门化(。专业化没有这样的限制。
从根本上说,这是因为不可能在主模板中的模板参数包之后提供任何模板参数,但在专用化中绝对可以这样做。例如,以下是连接两个tuple
专业化的一种方法:
template <typename T, typename U>
struct tuple_concat;
template <typename... Ts, typename... Us> // <== parameter pack *after* parameter pack
struct tuple_concat<tuple<Ts...>, tuple<Us...>> {
using type = tuple<Ts..., Us...>;
};
这很好,它有效,很有用。但是†能够在主类/变量/别名模板中编写这样的东西没有任何好处 - 因此禁止简单。
†与C++的所有事情一样,当然有一个脚注。您本可以提供用于触发替换失败的尾随默认模板参数。但是还有其他方法可以解决这个问题,然后我们很快就会有概念画板。
相关文章:
- 将数组作为参数传递给函数安全吗?作为第三方职能部门,可以探索他们想要的之外的其他元素
- 如何从其他功能C++访问参数?
- C++ 默认参数使用其他参数
- 如何将将参数包作为参数传递给其他模板类的模板类?
- lambda 作为接受其他参数的参数的初始化顺序
- 如何在其他类中使用参数化构造函数制作类的对象?
- 模板参数包如何具有其他尾随参数?
- 在C++单元测试上下文中,抽象基类是否应将其他抽象基类作为函数参数
- 了解'this'或其他参数是否为右值
- 使用其他模板类型参数作为要在函数签名中使用的类型别名声明
- 推断大多数模板对象的参数,但在调用模板函数时对其他对象显式
- 当模板类使用参数包时,如何传递其他模板参数
- 如何将char数组声明为函数参数?或告诉我此代码中还有其他问题?
- 递归回文检查,不使用向量、大小或其他参数
- 将成员函数作为参数传递给其他成员函数 (C++ 11 <function>)
- 依赖于其他模板参数的模板参数
- 传递多个参数的功能,该函数将类包含到其他函数
- 将指针类方法作为参数传递给其他类方法C
- 如果创建支持返回可变参数类型列表的通用模板 API,我应该使用 std::tuple 还是其他东西?
- 如何根据枚举参数返回其他类型