繁体   English   中英

如何在编译时获取类中的成员数

[英]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 ,虽然它打破了所有意图。
  • 用bitset替换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;
};

C ++没有内置的反射 。但是,您可以尝试使用外部库xCppRefl ,它应该提供反射(以前从未使用过,它已经很老了,所以如果使用该库,请告诉我)。

如果你这样做,就踩过源头

std::vector<DataMember> dataMembers = className.getDataMembers();

然后运行assert(dataMembers.size() == expectedNumMembers)你应该能够测试一个类中的成员数量是否符合预期。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM