Seo*_*oul 4 c++ template-meta-programming c++11 c++14 c++17
这是我正在使用的代码:
#include <iostream>
#include <type_traits>
using namespace std;
using match_type = void;
using match_type_bad = int;
// version A
template <typename T, typename Attempt = match_type>
struct simple_check : false_type {};
// version B
template <typename T>
struct simple_check<T, T> : true_type {};
int main() {
cout << simple_check<match_type>::value << endl;
cout << simple_check<match_type_bad>::value << endl;
}
Run Code Online (Sandbox Code Playgroud)
具有此模板专长的程序最终输出为:
1
0
Run Code Online (Sandbox Code Playgroud)
我对C ++的tmp的理解有些混乱,因为我一直认为输出应该是1 1。
我的理由是:
随着simple_check<match_type>它进入版本B,然后扩展到simple_check<match_type, match_type>从继承true_type。如此1预期。
难道不一样simple_check<match_type_bad>吗?
有了这个逻辑,任何类型的X进入simple_check<X>应该永远是版本B.
似乎版本A的默认值match_type在决定版本B时正在执行某些规则。
为什么版本A影响版本B?可能还有其他东西吗?
当您使模板无效时,在查看专业之前,它始终使用基本版本。因为第二个模板参数的默认值为,所以它在这里起作用match_type。
所以
simple_check<match_type> => simple_check<match_type, match_type>
^^ this uses the default value
simple_check<match_type_bad> => simple_check<match_type_bad, match_type>
^^ again, default value
Run Code Online (Sandbox Code Playgroud)
完成此操作后,编译器将查看这些专业知识。
只有在模板参数相同的情况下,专业化才能起作用,因此对于第一次检查,将选择专业化而不是基础模板,对于第二个检查,将使用基础模板,因为专业化无效。