我们说我们有一些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;
}
现在,有几十种方便的方法吗?对此这是一个坏主意吗?该功能是否仅为非会员?
答案 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); }
这应该处理转发到多个返回类型的函数