提案N4502如何运作? (“检测成语”)

时间:2017-05-30 04:45:45

标签: c++ c++11 visual-c++ c++14

我正在查看提案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似乎与我的理解一致。

那么,我错过了什么?这应该如何使用?

1 个答案:

答案 0 :(得分:0)

有一个拼写错误,应该是

template< class T >
using is_assignable = detect<T, assign_t>;

Demo