2016-05-01 82 views
1

我想編寫函數模板一樣如何檢測運算符[]是否適用於Type?

template< typename T > 
void foo(T& obj){ 
    obj[0] = xxxxxx; 
} 

其中T必須具有操作員[]適用。
T可以是任何類型的數組,std :: vector,std :: array或任何其他類型。所以,我不能用T作爲他們所有人的超類。我認爲這應該是在std::type_traits風格。

+0

出了什麼問題只是寫的代碼是什麼? –

+0

沒有錯,但如果可能我想限制錯誤的類型。 – kyb

+0

@kyb好吧,這些將被限制(除非你想排除純指針類型)。你想要更好的錯誤信息嗎? –

回答

2
template<class T> 
using LvalueIndexable = decltype(std::declval<T&>()[1]); 

template<class T, class U = void> 
using RequiresLvalueIndexable 
    = typename std::enable_if<std::experimental::is_detected<LvalueIndexable, T>{}, 
           U>::type; 

template< typename T, typename = RequiresLvalueIndexable<T> > 
void foo(T& obj){ 
    obj[0] = xxxxxx; 
} 

查看cppreference page瞭解如何實施std::experimental::is_detected

1

有幾種方法來限制模板類型:

1)聲明該函數模板作爲私有類的方法,然後從公共重載方法調用它,如所述here;

2)使用Boost靜態斷言和is_base_of比較模板和類型,請參閱here;

3)或包括type_traits和使用斷言static_assert(is_same<T, float>::value, "Error message");

相關問題