我想要做的是將一些類繼承爲extention
類。事情是extention
類必須知道它正在擴展的類。在static_assert中使用std :: is_base_of由於不完整類型而失敗
這可以簡單地實現這樣的:
template<typename Self>
class Extention
{
public:
void check() const
{
std::cout << "Extention is valid: "
<< std::boolalpha
<< std::is_base_of<Extention, Self>::value
<< std::endl;
}
};
class Foo : public Extention<Foo> {};
class Bar : public Extention<void> {};
的Foo
和Bar
類節目好,進一步擴展的不好的用法。
Foo().check(); → Extention is valid: true
Bar().check(); → Extention is valid: false
我想在編譯期間檢查模板的有效性,這使我寫
template<typename Self>
class Extention
{
static_assert(std::is_base_of<Extention, Self>::value);
};
然而,GCC運輸發射車我這個static_assert
是錯誤的,因爲class Foo
具有不完整的類型。
我在做什麼錯?
編輯:我使用-std=c++17
,錯誤不在static_assert
您可以將'static_assert'放入成員函數中,但要使其正常工作,必須通過調用它來實現該函數。 – HolyBlackCat
@HolyBlackCat把它放在構造函數中會起作用。不過,如果你有多個構造函數,它會是痛苦和容易出錯的... – Amxx
而不是使用靜態斷言敲擊所有構造函數,而是從受保護的'Requiredived'派生模板'Extention'是'Self'選項?這會給你一個根保護的默認構造函數'RequiredBase()',在其中掛起你的靜態斷言。或者,也許我誤解了你的目標。 – WhozCraig