如何在可变参数模板中使用索引

How To Utilize Index In Variadic Templates

本文关键字:索引 参数 变参      更新时间:2023-10-16

我不确定这是否可能...我现在有一堂课,说我的班级:

template < typename ... Tn > MyClass;

需要时,我必须调用提供的函数"get"来访问MyClass对象的成员:

MyClass<int, float, A> obj1;
...
int & i = get<0>(obj1);
A & a = get<2>(obj1);

这是我的问题:如果我打算制作一个可变参数模板"外部"并以这种形式使用它:

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。

以下内容应该可以解决您的问题:

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