2016-03-06 61 views
4

我经常遇到需要实现自定义复制/移动构造函数的情况。然而,一段时间后,它发生了类与新成员扩展和此自定义复制/移动构造函数没有更新,所以我正在寻找一种方法来防止代码编译没有更新这些方法。如何在编译时获得一个类的成员数

页眉代码:

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, "...");,有什么想法?

+1

我不认为有一种方法可以使用语言本身获得类的成员数量。希望有人比我更有知识可以证明。 –

+1

C++没有静态反射,没有。 – Barry

+1

一个好的Lint工具应该给你警告,当成员从构造函数,复制分配等丢失。 – 1201ProgramAlarm

回答

6

Rule of Zero

类具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符应与所有权(从单一职责原则同系列)专门处理。其他类不应该具有自定义析构函数,复制/移动构造函数或复制/移动赋值运算符。

在这种情况下,如果你只是有一个:

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; 
}; 
+0

工作,如果所有的代码将具有相同的API,不幸的是重构需要时间:S,如果你喜欢使用移动构造函数MSVC2013,你不能使用=默认。不过,我喜欢这个主意! TNX很多! – JVApen

+0

这不是我所寻找的,但我相信这是解决问题的最佳方案。所以我会接受这个。 – JVApen

-1

C++没有内置在reflection然而,你可以尝试使用外部库xCppRefl,它应该提供反射(以前从未使用它,它已经很老了,所以让我知道如果使用库适用于你)。

通过源步进如果你

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

然后运行assert(dataMembers.size() == expectedNumMembers)你应该能够测试是否成员的一类号码是你所期望的。

+1

他想要一个编译时解决方案 – Vincent

相关问题