我目前正在做一些模板元編程。在我的情況下,我可以處理任何「迭代」類型,即任何類型,其中typedef foo const_iterator
以相同的方式存在。我正在嘗試爲此使用新的C++ 11模板元編程,但是我無法找到檢測某種類型是否丟失的方法。在編譯時檢測typedef(模板元編程)
因爲我還需要根據其他特徵打開/關閉其他模板特化,所以我當前使用了一個帶有兩個參數的模板,第二個模板通過std::enable_if
生成。這是我目前在做什麼:
template <typename T, typename Enable = void>
struct Foo{}; // default case is invalid
template <typename T>
struct Foo< T, typename std::enable_if<std::is_fundamental<T>::value>::type>{
void do_stuff(){ ... }
};
template<typename T>
struct exists{
static const bool value = true;
};
template<typename T>
struct Foo<T, typename std::enable_if<exists< typename T::const_iterator >::value >::type> {
void do_stuff(){ ... }
};
我不能做這樣的事,而不exists
幫手模板。例如,只是在做
template<typename T>
struct Foo<T, typename T::const_iterator> {
void do_stuff(){ ... }
};
沒有工作,因爲在那些應該使用這種專業化的情況下,實例化了無效的默認情況。
但是我找不到這個exists
在新的C++ 11標準中的任何地方,據我所知簡單地從boost::type_traits
這種東西。然而homepage對boost::type_traits
沒有顯示任何可以用來代替的參考。
此功能缺失,還是我忽略了一些其他顯而易見的方式來實現所需的行爲?
你應該發佈一個關於這個如何工作的問題的鏈接。 :)另外,你似乎喜歡這個,看到你已經多次暗示它。 – Xeo
@Xeo,是的,這很簡單直接。但我沒有得到你的第一部分'你也許應該發佈一個關於這個工作的問題的鏈接。':) ...你的意思是在回答時我應該把一個鏈接到我以前的問題(而不是代碼本身)?我懷疑這不是建議在SO上。 – iammilind
Nono,我的意思是,你發佈一個鏈接到[你問的問題是如何工作的](http://stackoverflow.com/questions/6543652/different-template-syntax-for-finding-if-argument因爲它一開始並不明顯。 Woops,我剛纔注意到我寫了'問題',當然只意味着一個問題。 – Xeo