正确的可变包扩展
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}... {}
};
我正在研究 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}... {}
};