如何在Variadic模板中使用索引

时间:2013-12-30 07:29:09

标签: c++ variadic-templates

我不确定它是否可能...... 我现在上课了,说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。

1 个答案:

答案 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;
}