Tak, można to zrobić z rekursji ... w rzeczywistości jesteś bardziej lub mniej ponownego wdrażania std::tuple
(i pośrednio std::get
).
Ciężka praca ma na celu uzyskanie dostępu do członków, ponieważ nie można ich nazwać var1
, var2
itd., Chyba że ręcznie je nazwiesz.
template <typename... TypeList> struct foo;
template <typename Head, typename... Tail>
struct foo<Head, Tail...>: public foo<Tail...>
{
Head var;
};
Użyłem dziedziczenie tutaj, ale kompozycja (za pomocą elementu foo<Tail...> tail
) działa tak samo.
Teraz, jeśli typy są wyjątkowe, można uzyskać dostęp do elementu według rodzaju ...
// 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);
czy można uzyskać dostęp przez stanowisko:
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);
oba te można poprawić, aby lepiej raportować błędy (i chociaż użyłem obu tych technik, nawet nie próbowałem skompilować tego przykładowego kodu)
Czego chcesz var1 i var2 być ... jeśli sizeof (T) == 0 lub sizeof ... (T) == 1 ? – Andrzej
Dlaczego po prostu nie używać 'std :: tuple'? Dostęp do elementów jako 'std :: get (tup)' i typy jako 'std :: tuple_element > :: type'. –
Xeo
@Xeo masz rację, ale chcę nauczyć się podstawowej techniki pracy z szablonami var. Mam nadzieję, że zrozumiesz. – M3taSpl0it