【问题标题】:Construct an std:array from a smaller std::array从较小的 std::array 构造一个 std:array
【发布时间】:2021-09-01 20:32:09
【问题描述】:

我有一个模板类定义内部std::array 中的元素数量。我将如何从一个更大的对象构造一个新对象。到目前为止,我已经定义了复制构造函数,但这些构造函数无法编译,因为没有适合不同大小的 std::array 的构造函数。

当前类定义:

template<uint32_t MAX_LENGTH>
class A 
{
  A() = default;
  ~A() override = default;

  A(const A<MAX_LENGTH>& rhs) :
    current_length_(rhs.get_length()),
    data(rhs.get_data_const())
  { }

  template<uint32_t MAX_LENGTH_RHS, std::enable_if_t<(MAX_LENGTH_RHS < MAX_LENGTH), int> = 0>
  A(const A<MAX_LENGTH_RHS>& rhs) :
    current_length_(rhs.get_length()),
    data(rhs.get_data_const())
  { }

  template<uint32_t MAX_LENGTH_RHS, std::enable_if_t<(MAX_LENGTH_RHS < MAX_LENGTH), int> = 0>
  A(const A<MAX_LENGTH_RHS>&& rhs) :
    data(rhs.get_data_const())
  { }

  const std::array<int, MAX_LENGTH>& get_data_const() const { return data; }
 
  private:
    std::array<int, MAX_LENGTH> data;
} 

我要编译的内容:

A<5> a5;
// Set some data in a5.

// Next copy construct a larger object and set the data from a5 in it.
A<10> a10(a5); 

因为这失败并出现错误:

error: no matching function for call to ‘std::array<10>::array(const std::array<5>&)’
   5 |         data_(rhs.get_data_const())

那么当源对象的大小较小时,如何在复制构造函数初始化器列表中初始化一个std::array

【问题讨论】:

  • 请添加您在尝试此操作时收到的错误消息。此外,您可以在构造函数中手动处理数组内容的std::copy
  • @cigien 好点,添加了。
  • 您最好创建一个模板独立函数,并确保目标std::array 足够大以容纳您要复制到的数据。当您遇到所有极端情况时,独立功能似乎更容易处理。目前,我看不出你在哪里进行这些类型的检查。
  • @PaulMcKenzie 是 std::enable_if_t 没有涵盖这些?
  • 好吧,我没看到enable_if。但是您提到“复制构造函数”,但您所拥有的并不是真正的复制构造函数。它是构造函数,但不是复制构造函数。复制构造函数的类型与被复制到的确切类类型相同。 std::array&lt;int, 4&gt;std::array&lt;int, 3&gt; 的类型不同。

标签: c++ c++14


【解决方案1】:

用这样一些直接的东西来代替你所拥有的复制构造函数怎么样:

  template<uint32_t MAX_LENGTH_RHS, /*enable_if...*/>
  A(const A<MAX_LENGTH_RHS>& rhs) {
      const auto& rhs_data = rhs.get_data_const();
      std::copy(rhs_data.begin(), rhs_data.end(), data.begin());
  }

【讨论】:

  • std::copy 而不是循环。
  • 是的,可以,我希望没有循环的东西。
  • rhs_data 可能需要是一个常量引用。
  • 好像std::copy 会的。我确实有一种直觉,觉得 && 版本不适合这个,但是,总是下一张票可以让事情变得更好。
猜你喜欢
  • 2016-10-13
  • 1970-01-01
  • 1970-01-01
  • 2014-05-07
  • 1970-01-01
  • 2022-11-14
  • 2016-05-31
  • 2020-09-22
  • 2020-12-28
相关资源
最近更新 更多