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

Converting dozens of non-member functions to methods?

本文关键字:函数 成员 转换 方法 十个      更新时间:2023-10-16

假设我们有一些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;
}

现在,有没有什么方便的方法可以重复几十次呢?这是个坏主意吗?函数应该保持非成员吗?

我可以看到这样做的好处,因为您不想将foos暴露在外面…另外,您不希望通过复制/粘贴两次指定"text",这可能会在forward调用中出错。

这或多或少解决了使用宏的问题:

#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); }

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