我正在查看提案N4502,并一直试图绕过它。我很擅长第5部分,但是我认为我理解的东西会消失。也许这就是我在看它的方式。鉴于以下内容:
// primary template handles all types not supporting the operation: template< class, template<class> class, class = void_t< > > struct detect : false_type { }; // specialization recognizes/validates only types supporting the archetype: template< class T, template<class> class Op > struct detect< T, Op, void_t<Op<T>> > : true_type { };
要使用此检测元函数,我们提供另一个 元函数(即元回调)充满了角色 原型表达。例如,这是一个实现
is_assignable
类型特征:// archetypal expression for assignment operation: template< class T > using assign_t = decltype( declval<T&>() = declval<T const &>() ) // trait corresponding to that archetype: template< class T > using is_assignable = detect<void, assign_t, T>;
我应该能够检查类型是否可分配。没有给出如何使用它的例子,所以我假设它应该像以下一样简单:
static_assert(is_assignable<int>::value, "Not assignable.");
现在只看这个,看起来不对。我认为assign_t
无法与T
类型进行互动。
这对我来说是:
is_assignable<int> -> detect<void, assign_t, int>
然后将无法匹配任何专业化并转到继承自std::false_type
的基本案例。
编译此here似乎与我的理解一致。
那么,我错过了什么?这应该如何使用?