![](/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.