【发布时间】:2019-12-10 22:55:21
【问题描述】:
我正在学习模板元编程,最近,我在CPPConference 上看到一个关于 void_t 的演讲。不久之后,我发现了detection idiom。
但是,我仍然很难理解其中任何一个(尤其是检测成语,因为它基于 void_t)。我阅读了this 的博文和this stackoverflow 的博文,对我有所帮助,但我仍有一些问题。
如果我的理解是正确的,如果 void_t 里面的一个表达式是无效的,就会用这个表达式 SFINAEd out:
template< class, class = std::void_t<> >
struct has_type_member : std::false_type { };
因为类在这里是一个默认模板参数,可以表示任意数量的参数,而与它们的类型无关?甚至有必要说 class 等于 std::void_t 吗?写不就够了吗
template< class, class = void >
struct has_type_member : std::false_type { };
如果不是,为什么?
但是,如果表达式有效,则该表达式将被称为评估为 void:
template< class T >
struct has_type_member<T, std::void_t<typename T::type>> : std::true_type { };
为什么一个有效的表达式会被评估为 void,这对我们有什么帮助?另外,为什么表达式需要有效才能匹配 void_t?
【问题讨论】:
标签: c++ templates metaprogramming