【问题标题】:How to restrict a class template parameter to a certain subclass?如何将类模板参数限制为某个子类?
【发布时间】:2022-11-12 07:52:24
【问题描述】:

这就是我正在尝试的:

CSomeClassSomeDerivedClass 的模板参数:


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 更加头疼,它有时不能容忍偏离已知路径太远的东西。

【问题讨论】:

    标签: c++ templates class-template template-inheritance


    【解决方案1】:

    这是一种方法:

    template<class C>
    class SmuggleInBetween : public C
    {
        static_assert(std::is_base_of_v<SomeClass, C>, "C must be a descendant of SomeClass");
        /* ... */
    };
    

    当然,一般情况下,如果需要 SFINAE,也可以使用std::enable_if_v&lt;std::is_base_of_v&lt;SomeClass, C&gt;, ...&gt;;在这里,我认为static_assert() 可以解决问题。

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 2013-06-03
      • 1970-01-01
      • 1970-01-01
      • 2019-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多