हाँ, तो आप इस प्रत्यावर्तन के साथ वास्तव में क्या कर सकते हैं ... आप कर रहे हैं और अधिक या कम फिर से लागू करने 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 ... (टी) == 0 या sizeof ... (टी) == 1 ? – Andrzej
क्यों न केवल 'std :: tuple' का उपयोग करें? 'Std :: के रूप में तत्वों को एक्सेस करें (tup) 'और' std :: tuple_element > :: type' के रूप में टाइप करें। –
Xeo
@Xeo आप सही हैं लेकिन मैं विभिन्न टेम्पलेट्स के साथ काम करने के लिए मूल तकनीक सीखना चाहता हूं। मुझे उम्मीद है कि आप समझेंगे। – M3taSpl0it