我经常遇到需要实现自定义复制/移动构造函数的情况。然而,一段时间后,它发生了类与新成员扩展和此自定义复制/移动构造函数没有更新,所以我正在寻找一种方法来防止代码编译没有更新这些方法。如何在编译时获得一个类的成员数
页眉代码:
class MyClass
{
public:
MyClass(const MyClass &rhs);
// ...
private:
std::string _s;
std::unique_ptr<OtherClass> _owned;
bool _b;
};
.cpp的代码:
MyClass::MyClass(const MyClass &rhs)
: _s(rhs._s)
, _b(rhs._b)
{
if (rhs._owned)
_owned = rhs._owned->clone();
}
所以,如果我的一些成员添加到MyClass的,例如:std::size_t _size;
比我想的拷贝构造函数编译错误。
我目前的解决方案是增加:
static_assert(sizeof(MyClass) == 32, "...");
接近这个执行拷贝构造函数。所有这些工作都很好,不幸的是,这只有在班级规模增加时才有效。所以如果我反而添加bool _b2;
不幸的是所有编译。
因此,不是检查大小,我想检查成员的数量。不幸的是,我还没有找到。有什么建议吗?
我已经考虑:
- 禁止
bool
赞成short
,虽然它打破意向的全部意义。 - 由位集合替换
bool
,但不同的价值观不能有不同的名称 - 将所有默认在单独的结构可复制的成员,它引入了复杂性
- 添加
static const auto
与成员之类的号码,希望这得到更新添加一个成员
但是所有这些想法都需要代码/指南的改变,所以理想情况下我只想写static_assert(number_of_members<MyClass>::value == 3, "...");
,有什么想法?
我不认为有一种方法可以使用语言本身获得类的成员数量。希望有人比我更有知识可以证明。 –
C++没有静态反射,没有。 – Barry
一个好的Lint工具应该给你警告,当成员从构造函数,复制分配等丢失。 – 1201ProgramAlarm