CRTP在抽象类上的好处?

问题描述 投票:0回答:1

我对“好奇地重复使用的模板模式”这个概念不熟悉,我正在阅读它的潜在用例here

在那篇文章中,作者描述了一个简单的例子,其中我们有两个或更多个具有某些通用功能的类:

class A {
public:
  int function getValue() {...}
  void function setValue(int value) {...}

  // Some maths functions
  void scale() {...}
  void square() {...}
  void invert() {...}
}

class B {
public:
  double function getValue() {...}
  void function setValue(double value) {...}

  // Some maths functions
  void scale() {...}
  void square() {...}
  void invert() {...}
}

作者认为,与其在每个类中重复通用功能,不如使用CRTP:

template <typename T>
struct NumericalFunctions
{
    void scale(double multiplicator);
    void square();
    void invert();
};

class A : public NumericalFunctions<A>
{
public:
    double getValue();
    void setValue(double value);
};

但是我不明白的是为什么我们不能只对通用功能使用抽象类并从其继承:

class NumericalFunctions
{
    virtual double function getValue() = 0;
    virtual void function setValue(double value) = 0;
    void scale(double multiplicator){...};
    void square(){...};
    void invert(){...};
};

class A : public NumericalFunctions
{
public:
    double getValue() override;
    void setValue(double value) override;
};

我想不出CRTP方法提供的抽象类没有的任何好处。有什么好处吗?对我来说,抽象类方法似乎更简单,并且避免了在CRTP方法中将无效类型(一种不实现getValue()setValue()的类型)作为模板参数传递时,出现无助的编译器错误消息的潜在情况。 >

我对“好奇地重复使用的模板模式”这个概念不熟悉,我在这里读到它的潜在用例。在那篇文章中,作者描述了一个简单的例子,其中我们有两个或多个...

c++ abstract-class crtp
1个回答
1
投票

使用CRTP

© www.soinside.com 2019 - 2024. All rights reserved.