从较小的 std::array 构建 std:array
Construct an std:array from a smaller std::array
我有一个模板 class 定义内部 std::array
中元素的数量。我将如何从一个更大的对象构造一个新对象。到目前为止,我已经定义了复制构造函数,但这些构造函数无法编译,因为没有适合不同大小的 std::array
的构造函数。
当前class定义:
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
?
用像这样简单一些的东西代替你得到的复制构造函数怎么样:
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());
}
我有一个模板 class 定义内部 std::array
中元素的数量。我将如何从一个更大的对象构造一个新对象。到目前为止,我已经定义了复制构造函数,但这些构造函数无法编译,因为没有适合不同大小的 std::array
的构造函数。
当前class定义:
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
?
用像这样简单一些的东西代替你得到的复制构造函数怎么样:
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());
}