我寫一個新的容器,並試圖遵守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
的迭代器範圍構造函數的前面的聲明好嗎?
你不需要濫用返回類型和參數列表:http://flamingdangerzone.com/cxx11/2012/06/01/almost-static-if.html(和一個實現可以使用魔法,所以如果它真的想要避免它們,它不需要任何技巧) –
@ R.MartinhoFernandes:我喜歡你的博客,但是對於那些不想涉足所有這些的讀者來說,指出在C++ 11中,函數模板可以有一個默認的模板參數,這是一個應用'enable_if'的好地方。 –
@ R.MartinhoFernandes:這很有趣。不幸的是MSVC++(我想支持)還不支持。給我錯誤C4519:只允許在類模板上使用默認模板參數::( –