Vâng, bạn có thể làm điều này với đệ quy ... trên thực tế bạn có nhiều hoặc ít hơn được triển khai lại std::tuple
(và ngầm std::get
).
Công việc khó khăn đến khi truy cập các thành viên, vì bạn không thể gọi cho họ var1
, var2
, trừ khi bạn đặt tên chúng theo cách thủ công.
template <typename... TypeList> struct foo;
template <typename Head, typename... Tail>
struct foo<Head, Tail...>: public foo<Tail...>
{
Head var;
};
Tôi đã sử dụng thừa kế ở đây, nhưng thành phần (sử dụng thành viên foo<Tail...> tail
) hoạt động là tốt.
Bây giờ, nếu loại của bạn là duy nhất, bạn có thể truy cập vào các thành viên theo loại ...
// 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);
hoặc bạn có thể truy cập bằng cách vị trí:
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);
cả những có thể được cải thiện để nhận được báo cáo lỗi tốt hơn (và mặc dù tôi đã sử dụng cả hai kỹ thuật, tôi thậm chí không cố gắng biên dịch mã mẫu này)
Những gì bạn muốn var1 và var2 là nếu sizeof ... (T) == 0 hoặc sizeof ... (T) == 1 ? – Andrzej
Tại sao không chỉ sử dụng 'std :: tuple'? Truy cập các phần tử dưới dạng 'std :: nhận được (tup)' và các loại như 'std :: tuple_element > :: type'. –
Xeo
@ Xeo bạn nói đúng nhưng tôi muốn học kỹ thuật cơ bản để làm việc với các mẫu var. Tôi hy vọng bạn sẽ hiểu. – M3taSpl0it