簡體   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