是的,你可以用遞歸你這樣做......其實更多或更少的重新實施std::tuple
(和含蓄std::get
)。
努力工作來進入成員,因爲你不能稱之爲var1
,var2
等,除非你手動命名它們。
template <typename... TypeList> struct foo;
template <typename Head, typename... Tail>
struct foo<Head, Tail...>: public foo<Tail...>
{
Head var;
};
我在這裏用繼承,但組成(使用foo<Tail...> tail
成員)的作品也是如此。
現在,如果你的類型是獨一無二的,你可以訪問類型的成員...
// this overload if VarType is the first
template <typename VarType, typename... FooTail>
VarType& foo_get(foo<VarType, FooTail...>& f)
{
return f.var;
}
// this overload to walk down to foo's parent
template <typename VarType, typename FooHead, typename... FooTail>
VarType& foo_get(foo<FooHead, FooTail...>& foo)
{
return foo_get<VarType>(static_cast<foo<FooTail...>>(f));
}
// call like:
// int &x = foo_get<int>(my_foo_object);
,或者您可以通過訪問位置:
template <int N, typename... TypeList> struct GetHelper;
template <typename Head, typename... Tail>
struct GetHelper<0, Head, Tail...>
{
static Head& get(foo<Head, Tail...> &f) { return f.var; }
};
template <int N, typename Head, typename... Tail>
struct GetHelper<N, Head, Tail...>: public GetHelper<N-1, Tail...>
{};
template <int N, typename... TypeList>
auto foo_get(foo<TypeList...> &f)
-> GetHelper<N, TypeList...>::get(*static_cast<foo<TypeList...>*>(0))
{
return GetHelper<N, TypeList...>::get(f)
}
// call like:
// int &x = foo_get<2>(my_foo_object);
這些都可以提高到得到更好的錯誤報告(雖然我已經使用了這兩種技術,但我甚至沒有試過編譯這個示例代碼)
你想VAR1和VAR2什麼地方,如果...的sizeof(T)== 0或...的sizeof(T)== 1 ? – Andrzej 2012-07-13 12:08:34
爲什麼不使用'std :: tuple'?以'std :: get (tup)'和類型爲'std :: tuple_element > :: type'訪問元素。 –
Xeo
2012-07-13 12:38:09
@Xeo你是對的,但我想學習使用var模板的基本技巧。我希望你能理解。 – M3taSpl0it 2012-07-13 12:47:13