【发布时间】: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<int, 4>与std::array<int, 3>的类型不同。