正确的可变包扩展

Correct variadic pack expansion

我正在研究 tuple 的 C++20 实现:

template<size_t INDEX, typename T>
struct wrap { [[no_unique_address]] T data {}; };

template<typename...>
class base {};

template<size_t... INDEX, typename... Ts>
class base<index_sequence<INDEX...>, Ts...> : public wrap<INDEX, Ts>... {
public:
    constexpr base( const Ts &... args ) : /* !! HERE SHALL THE MAGIC COME */ {}
};

template<typename... Ts>
class tuple : public base<index_sequence_for<Ts...>, Ts...> {
public:
    /* Inherit base constructors */
    using base<index_sequence_for<Ts...>, Ts...>::base;
};

我的问题是: 如何正确实现代码代替 /* !! HERE SHALL THE MAGIC COME */ 来调用 base,意味着 wrap<> 构造函数 - wrap 复制构造函数采用 T 的相应实例(从 base 的模板可变参数包 Ts 扩展)保存在 args?

提前感谢任何愿意提供帮助的人。

参数包扩展也适用于成员初始化列表,所以你可以简单地这样做:

template<size_t INDEX, typename T>
struct wrap { [[no_unique_address]] T data {}; };

template<typename...>
class base {};

template<size_t... INDEX, typename... Ts>
class base<std::index_sequence<INDEX...>, Ts...> : public wrap<INDEX, Ts>... {
 public:
  constexpr base(const Ts&... args) : wrap<INDEX, Ts>{args}... {}
};

Demo.