将几十个非成员函数转换为方法?

时间:2015-09-04 06:20:17

标签: c++ c++11

我们说我们有一些class Foo,我们有很多非成员函数可以改变class Foo的向量;即:

void remove_duplicate_foos(std::vector<Foo>* foos_io) {
  std::vector<Foo>& foos = &foos_io;
  // removing duplicates
}

让我们说我们有很多这样的函数来操纵Foo向量。因此,我们汇总了一个名为FooStore的类,其中包含Foo的向量,并且具有操纵该Foo向量的方法。

class FooStore {
  public:
  void remove_duplicates() {
    ::remove_duplicates(&foos);
  }
  private:
  std::vector<Foo> foos;
}

现在,有几十种方便的方法吗?对此这是一个坏主意吗?该功能是否仅为非会员?

1 个答案:

答案 0 :(得分:1)

我可以看到这样做的好处,因为你不想将foos暴露给外面...而且,你不想通过复制/粘贴两次指定“文本”,可能会犯一个错误在前方呼叫中。

这或多或少使用宏来解决它:

#include <vector>

class Foo{};

void x1(std::vector<Foo>*){}
void x2(std::vector<Foo>*){}
void x3(std::vector<Foo>*){}

class FooStore
{
  public:
#define FOO_STORE_FWD(name)\
    void name()\
    {\
      ::name(&foos);\
    }

    FOO_STORE_FWD(x1)
    FOO_STORE_FWD(x2)
    FOO_STORE_FWD(x3)

#undef FOO_STORE_FWD

  private:
  std::vector<Foo> foos;
};


void testFooStore()
{
  FooStore f;
  f.x1();
  f.x2();
  f.x3();
}

此外,我可以看到将一个函数变成朋友的好处,但是那个函数必须“知道”你。在这种情况下,它知道你的成员,而不是你......

在c ++ 11中,可以按如下方式进行修改:

#define FOO_STORE_FWD(name)\
    auto name() -> decltype(::name(&foos)){ return ::name(&foos); }

这应该处理转发到多个返回类型的函数