我不确定它是否可能...... 我现在上课了,说MyClass:
template < typename ... Tn > MyClass;
需要时,我必须调用提供的函数'get'来访问MyClass对象的成员:
MyClass<int, float, A> obj1;
...
int & i = get<0>(obj1);
A & a = get<2>(obj1);
这是我的问题:如果我打算制作一个可变参数模板'Outer'并以这种形式使用它:
class C
{
public:
C(int, float, A);
};
-
Outer<C> obj2(obj1);
'外面':
template < typename Ty >
class Outer
{
private:
Ty inner;
//template < MyClass >
Outer(const MyClass<ty ...> & args_packer)
{
}
};
如何在可变参数模板中编写Outer的构造函数,以便它基本上可以这样做:
Outer(const MyClass<int, float, A> & args_packer)
: inner(get<0>(args_packer), get<1>(args_packer), get<2>(args_packer))
{
}
?我首先需要澄清的是,Outer不仅仅适用于MyClass。 MyClass仅用于调试Outer。
答案 0 :(得分:1)
以下应解决您的问题:
MyClass
似乎充当std::tuple
,所以我改用它。
#include <cstdint>
#include <tuple>
#if 1 // not present in C++11
template<std::size_t... Is> struct index_sequence{};
template<int N, std::size_t... Is>
struct make_index_sequence : public make_index_sequence<N - 1, N - 1, Is...> {};
template<std::size_t... Is>
struct make_index_sequence<0, Is...> : index_sequence<Is...> {};
#endif
template <typename T>
class Outer
{
public:
template <typename ... Ts>
Outer(const std::tuple<Ts ...>& args_packer) :
Outer(args_packer, make_index_sequence<sizeof...(Ts)>())
{
}
private:
template <typename ... Ts, std::size_t ... Is>
Outer(const std::tuple<Ts ...>& args_packer, index_sequence<Is...>) :
inner(std::get<Is>(args_packer)...)
{
}
private:
T inner;
};
现在,让我们测试一下:
class A{};
class C
{
public:
C(int, float, A);
};
int main(int argc, char *argv[])
{
auto t = std::make_tuple(42, 0.5f, A{});
Outer<C> out(t);
return 0;
}