可以消除这个基类构造函数吗?

chr*_*irk 2 c++ templates class subclass

有没有办法消除Foo中的显式构造函数调用,并以某种方式将Bar :: len分配给Bar的任何子类的大小?

class Bar
{
    size_t len_;

    Bar(size_t len) : len_(len) { }
};

class Foo : public Bar
{    
    Foo() : Bar(sizeof(Foo)) { }
};
Run Code Online (Sandbox Code Playgroud)

Mik*_*our 6

您可以使用"奇怪的递归模板"来通知基类的派生类的类型:

template <typename Derived>
class Bar
{
    size_t len_;
protected:
    Bar() : len_(sizeof(Derived)) {}
};

class Foo : public Bar<Foo>
{
};
Run Code Online (Sandbox Code Playgroud)

  • 这有点违背继承的目的,因为你不能在不知道派生类型的情况下贬低. (2认同)
  • CRTP为+1.@Dani:这种方法可以完美应用:`class base {int len; base(int l):len(l){}}; template <typename T> class base_t:base {base_t():base(sizeof(T)){}};`然后从`base_t`模板派生所有类,而不是`base`.额外的间接水平无法实现任何目标:) (2认同)