如何从const方法生成非const方法?

Tob*_*ias 9 c++ dry const-correctness

在努力保持正确性的同时,我经常发现自己正在编写这样的代码

class Bar;

class Foo {
public:
  const Bar* bar() const { /* code that gets a Bar somewhere */ }

  Bar* bar() {
    return const_cast< Bar* >(
      static_cast< const Foo* >(this)->bar());
  }
};
Run Code Online (Sandbox Code Playgroud)

对于很多方法,比如bar().编写这些非const方法,手动调用常量方法是乏味的; 此外,我觉得我在重复自己 - 这让我心疼.

我该怎么做才能减轻这个任务?(不允许使用宏和代码生成器.)

编辑:除了litb的解决方案,我也喜欢我自己的解决方案.:)

Joh*_*itb 6

另一种方法是编写一个调用函数的模板(使用CRTP)并从中继承.

template<typename D>
struct const_forward {
protected:
  // forbid deletion through a base-class ptr
  ~const_forward() { }

  template<typename R, R const*(D::*pf)()const>
  R *use_const() {
    return const_cast<R *>( (static_cast<D const*>(this)->*pf)() );
  }

  template<typename R, R const&(D::*pf)()const>
  R &use_const() {
    return const_cast<R &>( (static_cast<D const*>(this)->*pf)() );
  }
};

class Bar;

class Foo : public const_forward<Foo> {
public:
  const Bar* bar() const { /* code that gets a Bar somewhere */ }
  Bar* bar() { return use_const<Bar, &Foo::bar>(); }
};
Run Code Online (Sandbox Code Playgroud)

请注意,调用没有丢失性能:由于成员指针作为模板参数传递,因此可以像往常一样内联调用.