我观看了 Walter Brown 在 Cppcon14上关于现代模板编程(第一部分,第二部分)的演讲,他在演讲中介绍了他的 void_t
SFINAE 技术。
例如:
给定一个简单的变量模板,如果所有模板参数都格式良好,则计算结果为 void
:
template< class ... > using void_t = void;
以及以下特征,用于检查名为 成员的成员变量是否存在:
template< class , class = void >
struct has_member : std::false_type
{ };
// specialized as has_member< T , void > or discarded (sfinae)
template< class T >
struct has_member< T , void_t< decltype( T::member ) > > : std::true_type
{ };
我试着去理解为什么会这样,以及这是如何工作的,因此,举个小例子:
class A {
public:
int member;
};
class B {
};
static_assert( has_member< A >::value , "A" );
static_assert( has_member< B >::value , "B" );
1. has_member< A >
A::member
是存在的decltype( A::member )
结构良好void_t<>
有效,计算结果为 void
true_type
2. has_member< B >
B::member
不存在decltype( B::member )
格式不正确,无声地失败(sfinae)has_member< B , expression-sfinae >
,因此这个模板被丢弃has_member< B , class = void >
has_member< B >
评估为 false_type
问题:
1. 我的理解正确吗?
2.Walter Brown 指出,默认参数的类型必须与 void_t
中使用的类型完全相同才能正常工作。为什么?(我不明白为什么这种类型需要匹配,不是任何默认类型都可以做到吗?)