我想創建一個模板,我可以輸入一個索引,它會給我在該索引的類型。我知道我可以用decltype(std::get<N>(tup))
來做到這一點,但我想自己實現這一點。例如,我想做到這一點,如何從元組中獲得第N個類型?
typename get<N, std::tuple<int, bool, std::string>>::type;
...它會給我在N - 1
位置的類型(因爲數組進行索引從0開始)。我怎樣才能做到這一點?謝謝。
我想創建一個模板,我可以輸入一個索引,它會給我在該索引的類型。我知道我可以用decltype(std::get<N>(tup))
來做到這一點,但我想自己實現這一點。例如,我想做到這一點,如何從元組中獲得第N個類型?
typename get<N, std::tuple<int, bool, std::string>>::type;
...它會給我在N - 1
位置的類型(因爲數組進行索引從0開始)。我怎樣才能做到這一點?謝謝。
您可以使用類模板和部分特化來做你想做的事。 (注意: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
}
@ user1131467這就是我決定做的事情 – 0x499602D2
該特徵已經存在,它被稱爲std::tuple_element
。
這是一個live example,它演示了它的用法。
但我說我想自己實現這個。 :) – user2030677
鑑於*「我知道我可以做到這一點,但我希望自己實現這一點。」*,這不是一個答案,而是一個評論(儘管一個有用的,因爲OP似乎並不知道'的std :: tuple_element')。 –
@ user2030677:對不起,我應該更好地閱讀問題的文本 - 我不知何故跳過那部分:) –
充分尊重0x499602D2的優良的答案,我想你應該接受的答案建議標準庫特徵。請考慮這樣做。 – einpoklum