C++:奇怪的重复模板模式是什么?并且可以奇怪地重复模板模式取代虚拟功能?

Mar*_* A. 9 c++ templates virtual-functions crtp

我没有对问题的准确描述,所以我只是问这是否可能(如果是的话,其他一些信息会很棒).

程序员告诉我,你可以避免虚函数/多态导致的运行时开销.他说为了避免运行时开销,你可以在名为Curiously_recurring_template_pattern的模式中使用模板,它看起来像这样:

class Derived : public Base<Derived>
{
  // ... implementation here
};
Run Code Online (Sandbox Code Playgroud)

这个奇怪的重复模板模式如何工作?

如何使用Curiously-Recurring-Template-Pattern替换正常的虚函数/多态?

我弄错了吗?

Seb*_*edl 19

非常具体地,可以使用CRTP代替具有虚函数的基类来实现模板方法模式而无需虚函数调用开销.

使用虚函数,TMP如下所示:

class ProvidesMethod {
protected:
  void Method() {
    // do something
    Part1();
    // do something else
    Part2();
    // do something final
  }

private:
  virtual void Part1() = 0;
  virtual void Part2() = 0;
};

class ExposesMethod : private ProvidesMethod {
public:
  using ProvidesMethod::Method;

private:
  void Part1() {
    // first part implementation
  }
  void Part2() {
    // second part implementation
  }
};
Run Code Online (Sandbox Code Playgroud)

使用CRTP,它看起来像这样:

template <typename Derived>
class ProvidesMethod {
protected:
  void Method() {
    // do something
    self().Part1();
    // do something else
    self().Part2();
    // do something final
  }

private:
  Derived& self() { return *static_cast<Derived*>(this); }
  const Derived& self() const { return *static_cast<const Derived*>(this); }
};

class ExposesMethod : private ProvidesMethod<ExposesMethod> {
public:
  using ProvidesMethod<ExposesMethod>::Method;

private:
  friend class ProvidesMethod<ExposesMethod>;
  void Part1() {
    // first part implementation
  }
  void Part2() {
    // second part implementation
  }
};
Run Code Online (Sandbox Code Playgroud)