【问题标题】:Correct variadic pack expansion正确的可变参数包展开
【发布时间】:2022-01-08 17:13:39
【问题描述】:

我正在研究 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&lt;&gt;构造函数——wrap复制构造函数取T的对应实例(扩展自base的模板变量包Ts)保持在args

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

【问题讨论】:

    标签: c++ templates variadic-templates c++20 stdtuple


    【解决方案1】:

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

    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.

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-04-09
      • 2014-10-30
      • 2020-03-19
      • 2015-05-21
      • 2019-03-23
      • 2017-01-10
      • 1970-01-01
      相关资源
      最近更新 更多