给聚合一个转换构造函数?
Give an aggregate a converting constructor?
我正在编写一个由多个 uint64_t
组成的固定大小的大整数类型,如下面的(简化)示例所示。我希望我的类型表现得像内置整数类型,这意味着(除其他外):
- 如果你不给它赋值,它应该是未初始化的,并且
- 它应该接受来自其他内置整数类型的扩展。
然而,在我看来,人们无法编写同时满足这两个属性的类型。这是因为 属性 1 要求类型是一个聚合,这意味着它必须没有构造函数,我们需要一个构造函数来实现 属性 2.
有没有办法写出同时满足这两个性质的大整数类型?
#include <array>
#include <cstdint>
struct uint128_t{
std::array<uint64_t, 2> data;
};
int main(){
uint128_t x; // uninitialized (good)
uint128_t y = 100; // can we make this work while ensuring that the previous line still works?
}
This is because property 1 requires the type to be an aggregate, which means it must have no constructors
不,它可以有空的构造函数
class uint128_t{
public:
// this is an empty constructor, it does not initializes data
uint128_t() {};
// calling this ctor will create an object with an initial value "val"
uint128_t(uint64_t val)
:data{0, val} {}
// for larger numbers
uint128_t(std::string_view src) {
// implement it yourself
}
private:
std::array<uint64_t, 2> data;
};
uint128_t() {}
等构造函数默认会使您的数组保持未初始化状态。使成员未初始化的能力与聚合无关。
但还有一个更好的选择:uint128() = default;
。它会导致 uint128_t x;
未初始化,但 uint128_t x{};
将被清零,就像 built-in 类型一样。
我正在编写一个由多个 uint64_t
组成的固定大小的大整数类型,如下面的(简化)示例所示。我希望我的类型表现得像内置整数类型,这意味着(除其他外):
- 如果你不给它赋值,它应该是未初始化的,并且
- 它应该接受来自其他内置整数类型的扩展。
然而,在我看来,人们无法编写同时满足这两个属性的类型。这是因为 属性 1 要求类型是一个聚合,这意味着它必须没有构造函数,我们需要一个构造函数来实现 属性 2.
有没有办法写出同时满足这两个性质的大整数类型?
#include <array>
#include <cstdint>
struct uint128_t{
std::array<uint64_t, 2> data;
};
int main(){
uint128_t x; // uninitialized (good)
uint128_t y = 100; // can we make this work while ensuring that the previous line still works?
}
This is because property 1 requires the type to be an aggregate, which means it must have no constructors
不,它可以有空的构造函数
class uint128_t{
public:
// this is an empty constructor, it does not initializes data
uint128_t() {};
// calling this ctor will create an object with an initial value "val"
uint128_t(uint64_t val)
:data{0, val} {}
// for larger numbers
uint128_t(std::string_view src) {
// implement it yourself
}
private:
std::array<uint64_t, 2> data;
};
uint128_t() {}
等构造函数默认会使您的数组保持未初始化状态。使成员未初始化的能力与聚合无关。
但还有一个更好的选择:uint128() = default;
。它会导致 uint128_t x;
未初始化,但 uint128_t x{};
将被清零,就像 built-in 类型一样。