2013-06-04 74 views
13

我想創建一個模板,我可以輸入一個索引,它會給我在該索引的類型。我知道我可以用decltype(std::get<N>(tup))來做到這一點,但我想自己實現這一點。例如,我想做到這一點,如何從元組中獲得第N個類型?

typename get<N, std::tuple<int, bool, std::string>>::type; 

...它會給我在N - 1位置的類型(因爲數組進行索引從0開始)。我怎樣才能做到這一點?謝謝。

+0

充分尊重0x499602D2的優良的答案,我想你應該接受的答案建議標準庫特徵。請考慮這樣做。 – einpoklum

回答

12

您可以使用類模板和部分特化來做你想做的事。 (注意:std::tuple_element做幾乎同樣喜歡對方回答說):

#include <tuple> 
#include <type_traits> 

template <int N, typename... Ts> 
struct get; 

template <int N, typename T, typename... Ts> 
struct get<N, std::tuple<T, Ts...>> 
{ 
    using type = typename get<N - 1, std::tuple<Ts...>>::type; 
}; 

template <typename T, typename... Ts> 
struct get<0, std::tuple<T, Ts...>> 
{ 
    using type = T; 
}; 

int main() 
{ 
    using var = std::tuple<int, bool, std::string>; 
    using type = get<2, var>::type; 

    static_assert(std::is_same<type, std::string>::value, ""); // works 
} 
+0

@ user1131467這就是我決定做的事情 – 0x499602D2

10

該特徵已經存在,它被稱爲std::tuple_element

這是一個live example,它演示了它的用法。

+1

但我說我想自己實現這個。 :) – user2030677

+0

鑑於*「我知道我可以做到這一點,但我希望自己實現這一點。」*,這不是一個答案,而是一個評論(儘管一個有用的,因爲OP似乎並不知道'的std :: tuple_element')。 –

+0

@ user2030677:對不起,我應該更好地閱讀問題的文本 - 我不知何故跳過那部分:) –

相關問題