如何改写具有默认参数的模板特化为长尾?

2026-04-16 19:161阅读0评论SEO资源
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计498个文字,预计阅读时间需要2分钟。

如何改写具有默认参数的模板特化为长尾?

cpp参见解英答案:关于 `void_t` 的工作原理,以下是一个示例程序。

我有这样一个程序。它包含一个基本模板 struct X 和一个 SFINAE 的特殊化部分。

cpptemplatestruct X { X() { std::cout << in 1 <

templatestruct X::type> { X() { std::cout << in 2 < 参见英文答案 > How does `void_t` work2个
我有一个程序如下.有一个基本模板struct X和一个SFINAE的部分特化.

template <typename T, typename U = void> struct X{ X() { std::cout << "in 1" << std::endl; }; }; template <typename T> struct X< T, std::enable_if_t<std::is_integral_v<T>> > { X() { std::cout << "in 2" << std::endl; }; }; int main() { X<int> x; }

在2中运行程序时打印.

>为什么选择第二个特化而不是第一个特化,因为它们都有效地声明了结构X< int,void>.是什么让std :: enable_if_t< std :: is_integral_v< T>>比基本模板中显示的默认模板类型参数更专业?
>为什么基本模板的默认类型参数必须与要调用的部分特化的部分特化定义的类型相同,并且2要打印.
为什么要更改为std :: enable_if_t< std :: is_integral_v< T>,bool>导致1中的基本模板被调用?

您的问题的答案位于 Template Partial Ordering.这是编译器用于确定哪个模板最适合的机制(无论是函数模板重载,还是在您的情况下,是类模板特化).

简而言之,您的通用模板实现有2个参数T和U,而您的SFINAE专业化只有T参数,而第二个是从T推导出来的.因此它比一般情况更专业,最后,当您参考时X< int,void>,选择特化.

现在问题2.假设我们用bool而不是void替换enable_if参数.现在我们的专业化将是X< int,bool>而不是X< int,void>,所以当你引用X< int>,即X< int,void>时,它与专业化不再匹配,因为它们是2种不同的类型.

如何改写具有默认参数的模板特化为长尾?

本文共计498个文字,预计阅读时间需要2分钟。

如何改写具有默认参数的模板特化为长尾?

cpp参见解英答案:关于 `void_t` 的工作原理,以下是一个示例程序。

我有这样一个程序。它包含一个基本模板 struct X 和一个 SFINAE 的特殊化部分。

cpptemplatestruct X { X() { std::cout << in 1 <

templatestruct X::type> { X() { std::cout << in 2 < 参见英文答案 > How does `void_t` work2个
我有一个程序如下.有一个基本模板struct X和一个SFINAE的部分特化.

template <typename T, typename U = void> struct X{ X() { std::cout << "in 1" << std::endl; }; }; template <typename T> struct X< T, std::enable_if_t<std::is_integral_v<T>> > { X() { std::cout << "in 2" << std::endl; }; }; int main() { X<int> x; }

在2中运行程序时打印.

>为什么选择第二个特化而不是第一个特化,因为它们都有效地声明了结构X< int,void>.是什么让std :: enable_if_t< std :: is_integral_v< T>>比基本模板中显示的默认模板类型参数更专业?
>为什么基本模板的默认类型参数必须与要调用的部分特化的部分特化定义的类型相同,并且2要打印.
为什么要更改为std :: enable_if_t< std :: is_integral_v< T>,bool>导致1中的基本模板被调用?

您的问题的答案位于 Template Partial Ordering.这是编译器用于确定哪个模板最适合的机制(无论是函数模板重载,还是在您的情况下,是类模板特化).

简而言之,您的通用模板实现有2个参数T和U,而您的SFINAE专业化只有T参数,而第二个是从T推导出来的.因此它比一般情况更专业,最后,当您参考时X< int,void>,选择特化.

现在问题2.假设我们用bool而不是void替换enable_if参数.现在我们的专业化将是X< int,bool>而不是X< int,void>,所以当你引用X< int>,即X< int,void>时,它与专业化不再匹配,因为它们是2种不同的类型.

如何改写具有默认参数的模板特化为长尾?