2012-12-09 43 views
1

我寫一個新的容器,並試圖遵守N3485 23.2.3 [sequence.reqmts]/14,其中規定:可以將enable_if用作非額外參數(例如,用於構造函數)?

對於此條款,並在第21條中定義的每個序列容器:

  • 如果構造

    template <class InputIterator> 
    X(InputIterator first, InputIterator last, 
        const allocator_type& alloc = allocator_type()) 
    

    被調用類型InputIterator不符合 輸入迭代器,那麼構造函數將不參與超載 分辨率。

/14重複該幾乎逐字採取迭代範圍的成員函數)

N3485 23.2.3 [sequence.reqmts]/15說:

的程度的實現確定某個類型不能輸入迭代器是未指定的,除了作爲最小整數類型不應該有資格作爲輸入迭代器。

我的理解是,這句話「不得參加重載」意味着容器實現者應該使用SFINAE招數模板參數推導過程中禁用該構造函數或成員函數。對於成員職能來說,這沒什麼大不了的;因爲功能上的返回類型是使用enable_if的正常方式。但是對於構造函數,沒有可以應用的返回類型enable_if。這是我第一次來聲明構造嘗試:

// The enable_if use below is to comply with 23.2.3 [sequence.reqmts]/14: 
//  ... is called with a type InputIterator that does not qualify as an input iterator 
//  then the constructor shall not participate in overload resolution. 
template <typename InputIterator> 
path(std::enable_if<!std::is_integral<InputIterator>::value, InputIterator>::type first, 
    InputIterator last, Allocator const& allocator = allocator_type()); 

然而,升壓轉換器的使用enable_if docs初始化爲nullptr,而不是使用實際參數的函數指針假人蔘數建議。對於這裏的正確行爲,這是必要的嗎?或者是path的迭代器範圍構造函數的前面的聲明好嗎?

+1

你不需要濫用返回類型和參數列表:http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html(和一個實現可以使用魔法,所以如果它真的想要避免它們,它不需要任何技巧) –

+0

@ R.MartinhoFernandes:我喜歡你的博客,但是對於那些不想涉足所有這些的讀者來說,指出在C++ 11中,函數模板可以有一個默認的模板參數,這是一個應用'enable_if'的好地方。 –

+0

@ R.MartinhoFernandes:這很有趣。不幸的是MSVC++(我想支持)還不支持。給我錯誤C4519:只允許在類模板上使用默認模板參數::( –

回答

3

的好機器人(R.費爾南德斯Martinho)討論這個問題用乾淨的C++ 11解決方案,即使用默認模板參數應用enable_if,在his blog

然而,讓我在這裏指出做

template< class Type > 
    void foo(typename Something<Type>::T) 

箔參數推導

仍然可以通過顯式提供模板參數來調用該函數。但在C++中,編譯器會拒絕匹配例如一個MyType實際參數形式參數類型Something<Blah>::T,因爲儘管這可以在某些特殊情況下,不能總是做來完成(有可能是Blah無數的選擇,其中Something<Blah>::TMyType)。因此,目前的方法通常不會工作,但規範要求的整個問題是C++ 11問題,​​所以C++ 11特定的解決方案是OK的! :-)

+3

關於推導的好處,但請注意,在問題的具體示例中,有另一個參數具有相同的類型,所以它實際上可以是推測在這個特殊的情況下。 –

+0

@ R.MartinhoFernandes:謝謝,我添加了「一般」的話:-) –

+1

我沒有想到一個關於嬰兒名稱和東西的網站包含有關C++ 11的內容。 – mfontanini

相關問題