如何在C ++中实现与基类的流畅接口

时间:2010-05-04 19:16:17

标签: c++

如何在C ++中实现这个流畅的界面:

class Base {
public:
  Base& add(int x) {
    return *this;
  }
}

class Derived : public Base {
public:
  Derived& minus(int x) {
    return *this;
  }
}

Derived d;
d.add(1).minus(2).add(3).minus(4);

当前代码不起作用,因为Base类对Derived类等一无所知。我非常感谢提示/建议。

3 个答案:

答案 0 :(得分:11)

使基类模板化。使用所需的返回类型Base模板类型,如下所示:

template <typename T>
class Base {
public:
  T& add(int x) {
    return *static_cast<T *>(this);
  }
}

然后继承像Base这样的Derived:

class Derived : public Base<Derived>

或者(作为诺亚评论的答案),如果您不想更改Base,您可以使用执行转换的中间类,如下所示:

template <typename T>
class Intermediate : public Base {
public:
  T& add(int x) {
    Base::add(x);
    return *static_cast<T *>(this);
  }
}

让Derived继承自Intermediate:

class Derived : public Intermediate<Derived>

答案 1 :(得分:1)

在C ++中无法使用此接口。您必须在Base中创建minus()虚函数或使用执行某种形式的类型检测的非成员函数。

除非在Base方面有意义,否则不要拉负()。

答案 2 :(得分:1)

问题在于您的功能

  Base& add(int x); 

这类似于operator + =(),它也必须被覆盖才能无缝地工作。

您需要在派生类上重写此函数。

class Derived : public Base {
public:
  Derived& minus(int x) {
    return *this;
  }
  Derived & add(int x) {
    return  static_cast<Derived &>(this->Base::add(x));
  }
}

这样d.add(1)将返回对d的引用。