2015-06-17 51 views
3

我有以下的重載函數:別名一個const的返回類型重載函數

template<size_t N, typename T> 
auto get(const T & _t) -> decltype(std::get<...>(_t)) { 
    ... 
} 

template<size_t N, typename T> 
auto get(T & _t) -> decltype(std::get<...>(_t)) { 
    ... 
} 

首先的問題是:

不第一個使用std::get(const tuple<_Elements...>& __t) ,第二個std::get(tuple<_Elements...>& __t) ??

現在我想我的別名新的函數get的返回類型:

using type = typename decltype(aux::get<I>(data))::type; 

其中一個用在這裏?常量還是不是?和我如何選擇?我想同時別名! data是非const

回答

3

是的,第一個使用const過載和第二個非const之一。這是因爲_t在第一種情況下爲const,在第二種情況下爲const

哪一個用於類型別名取決於data的類型。它是const?如果是這樣,const過載是別名。如果不是,那麼非const就是。

要獲得任何類型的「虛擬值」,可以使用std::declval。此代碼將別名const版本:

using type = typename decltype(aux::get<I>(std::declval<const YourTypeHere>()))::type; 
+0

'data'是非const的,我怎麼能得到const的類型:'類型名decltype(AUX ::得到(...)):: type'時參數是const,我不想添加新變量 –

+0

@OthmanBenchekroun已添加到答案 – Angew

相關問題