![](/img/trans.png)
[英]How a derived class cannot resolved members of its base class at compile time?
[英]How to get the number of members in a class at compile time
我经常遇到必须实现自定义复制/移动构造函数的情况。 但是一段时间后,会发生类使用新成员进行扩展而且此自定义复制/移动构造函数未更新,因此我正在寻找一种方法来防止代码编译而不更新这些方法。
标题代码:
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, "...");
, 有任何想法吗?
零度规则 :
具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符的类应专门处理所有权(遵循单一责任原则)。 其他类不应该有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符。
在这种情况下,如果你只是有一个:
template <class T>
struct clone_unique_ptr {
std::unique_ptr<T> p;
clone_unique_ptr(const clone_unique_ptr& rhs)
: p(rhs.p ? rhs.p->clone() : nullptr)
{ }
// rest of special members
};
那你就不用写任何特别的东西了:
class MyClass
{
public:
MyClass(const MyClass&) = default;
private:
std::string _s;
clone_unique_ptr<OtherClass> _owned;
bool _b;
};
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.