【问题标题】:Initialize const array in a variadic constructor在可变参数构造函数中初始化 const 数组
【发布时间】:2019-09-22 12:33:05
【问题描述】:

我想从可变参数初始化一个 const 数组。但是在这段代码中,只有 values 数组中的第一个值被初始化,其余的都是零。 我该如何解决?

我从来没有处理过可变参数,我不知道它们基本上是如何工作的。

struct Object
{
    const int values[8];

    constexpr Object()
        : values{}
    {}

    constexpr Object(int values...)
        : values{values}
    {}
}

// in main.cpp :
Object o = { 1, 2, 3 };

补充问题:我可以编写一个类模板并使其数组大小等于可变参数计数吗?

【问题讨论】:

    标签: c++ constructor constants variadic


    【解决方案1】:

    要修复你可以编写的第一个代码:

    template<class ... Values>
    constexpr Object(Values ... values)
        : values{values...}
    {
        static_assert(sizeof...(values) == 8);
    }
    

    关于您的其他问题:

    template<int ... ints>
    struct Object2
    {
        const int values[sizeof...(ints)]{ints...};
    };
    Object2<1,21,3> o2; // array with 3 elements
    std::cout << o2.values[1] << std::endl; // 21
    

    数组的大小需要在编译时知道。所以在调用构造函数时不能指定数组的长度,为时已晚。但是实例化模板时可以使用非类型参数。

    Demo

    【讨论】:

      【解决方案2】:

      从 C++17 开始,我们可以利用 user-defined deduction guides

      template <class T, size_t N>
      class Object
      {
          T d_[N];
      public:
          Object() = default;
      
          template <class... Ts>
          constexpr Object(Ts... others) : d_{others...} {}
      
          constexpr auto size() const noexcept { return N; }
      
          constexpr auto operator[] (size_t i) const noexcept { return d_[i]; }
      };
      
      // Deduction guide
      template <class T, class... Ts> Object(T, Ts...) -> Object<T, 1 + sizeof...(Ts)>;
      

      直播,here

      【讨论】:

      • 太棒了,这就是我想要的:从可变参数到它们的数字 N 并构建一些 Object
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多