這就是我正在嘗試的:
C是一個模板引數,要么是SomeClass要么SomeDerivedClass:
class SomeClass
{
protected:
int ProtectedBaseClassMember;
virtual void SomeFunctionFromBaseClass();
};
class SomeDerivedClass : public SomeClass { };
如何限制C到子類SomeClass?
template<class C>
class SmuggleInBetween : public C
{
public:
SmuggleInBetween()
{
// does not compile: unknown symbol "ProtectedBaseClassMember"
ProtectedBaseClassMember = 5;
// does compile, but ...
SomeClass* Me = static_cast<SomeClass>(this);
// ... member not accessible:
Me->ProtectedBaseClassMember = 5;
}
protected:
// doesn't compile: "method with override specifier did not override any base class method"
virtual void SomeFunctionFromBaseClass() override;
double DoubleProperty;
};
我發現了一個非常相關的問題:Restrict C Template parameter to subclass,但在那里作者似乎很好,只是限制模板引數而不會訪問基類中的任何符號。
模板SmuggleInBetween類的用例是這樣的:我可以創建
class SomeImprovedClass : public SmuggleInBetween<SomeClass> { };
和
class SomeImprovedDerivedClass : public SmuggleInBetween<SomeDerivedClass> { };
無需復制我通過此模式走私的代碼(如果可能)。
順便說一句,這發生在虛幻引擎的背景關系中。可能在 C 中可行的解決方案仍然會導致 Unreal Header Tool 的額外頭痛,該工具有時不能容忍偏離已知路徑太遠的事情。
uj5u.com熱心網友回復:
這是一種方法:
template<class C>
class SmuggleInBetween : public C
{
static_assert(std::is_base_of_v<SomeClass, C>, "C must be a descendant of SomeClass");
/* ... */
};
當然,一般情況下std::enable_if_v<std::is_base_of_v<SomeClass, C>, ...>如果需要SFINAE也可以使用;我認為在這里static_assert()可以解決問題。
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/532070.html
標籤:C 模板类模板模板继承
