2017-05-30 42 views
3

我在看提案N4502,並一直在試圖繞過它。我很高興看到第5部分,但是我認爲我理解的東西已經消失了。也許這只是我如何看待它。鑑於以下幾點:建議N4502如何工作? (「檢測成語」)

// 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似乎與我的理解一致。

那麼,我錯過了什麼?這應該如何使用?

回答

0

有一個錯字,它應該是

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

Demo

+0

我已經固定的上演示錯字。 – Adrian

+0

我在這方面沒有看到任何編輯。在你的問題和你的鏈接中,你仍然有錯誤的檢測到(!='detect ')。 – Jarod42

+0

>編譯這個[here](http://rextester.com/IGZS87648)似乎同意我的理解。 – Adrian