可变模板的部分专门化
Partial specialization of variadic templates
本文关键字:专门化 更新时间:2023-10-16
考虑下面的类模板'X'及其部分专门化。
template <class ...Types>
struct X {}; // #1
template <class T1>
struct X<T1> {}; // #2
template <class T1, class ...Types>
struct X<T1, Types...> {}; // #3
X<int> x; // #2 or #3 ?
我怀疑X
很明显,#2和#3都比#1更专门化,现在比较#2和#3。根据14.5.5.2,让我们考虑一下下面的#2'和#3'哪个更专门化。
template <class T1>
void f(X<T1>); // #2'
template <class T1, class ...Types>
void f(X<T1, Types...>); // #3'
根据14.8.2.4,第一步是使用#2'作为实参模板,#3'作为形参模板进行模板实参推导。给定唯一的参数类型为X
A = X<A1>, P = X<T1, Types...> => T1 = A1, Types = {}
第二步使用#3'作为实参模板,#2'作为形参模板。给定唯一的参数类型是X<A1,>,根据14.8.2.5/9(注意这一段最近由N3281修订),Args被简单忽略,推导出的T1为A1,参数推导成功。
A = X<A1, Args...>, P = X<T1> => T1 = A1 (Args is ignored)
最后,双向参数推导成功。所以2号和3号一样专业。综上所述,X
我的问题是:"我的解释正确吗?"
如果这个解释是正确的,那么20.9.7.6/3中'std::common_type'的定义是不合适的。
template <class ...T>
struct common_type; // #1
template <class T>
struct common_type<T> // #2
{
typedef T type;
};
template <class T, class U>
struct common_type<T, U> // #3
{
typedef
decltype(true ? declval<T>() : declval<U>())
type;
};
template <class T, class U, class ...V>
struct common_type<T, U, V...> // #4
{
typedef typename
common_type<typename common_type<T, U>::type, V...>::type
type;
};
当common_type<A,>使用时,#3和#4是不明确的。
注意:在第一个例子中,GCC 4.7.0(快照)和Clang 3.0选择#2。然而,这些编译器是如此不可靠,以至于它们不遵循N3281的其他更改。
14.8.2.4, section 11(我参考草案N3242)。
在大多数情况下,所有模板形参的值必须按照for的顺序排列演绎成功,但对于部分排序的目的是一个模板参数可以不带值,前提是它没有在用于部分排序的类型。[注:模板参数。在非演绎的上下文中使用被认为是使用。-结束音符][例子:
template <class T> T f(int); // #1 template <class T, class U> T f(U); // #2 void g() { f<int>(1); // calls #1 }
在你的例子中,#3将被使用。
相关文章:
- 是否可以对零模板参数进行模板专门化
- 尝试根据类中 typedef 的存在来专门化模板函数
- 如何基于模板化类的基类专门化成员函数
- 如何为指向复杂值的迭代器专门化算法?
- 专门化模板覆盖函数/避免对象切片
- 我能否根据其运算符()的签名专门化可变参数模板参数
- 如何使用模板化类专门化模板化函数?
- 线程 std::调用未知类型,无法专门化函数错误
- 输入两个不专门化大小的矩阵
- 如何在模板类中专门化赋值运算符?
- 如何专门化容器和枚举的模板
- Clang拒绝类模板的嵌套类仅通过专门化定义的代码是正确的吗
- 取消专门化C++模板参数
- SFINAE的变分变量模板专门化
- 如何在编译时专门化大型模板函数中的小部分
- 如何在c++运算符()中专门化调用模板
- 模板函数,其中一个参数需要专门化,而另一个不需要
- 如何专门化字符串数组的模板?
- 如何专门化模板
- 如何避免为模板化迭代器的每个可能的实例化专门化iterator_traits?