我有一个类有另一个类对象的向量作为成员。在这个类的很多功能我必须做对Vector中的所有对象相同的操作:遍历矢量和调用函数
class Small
{
public:
void foo();
void bar(int x);
// and many more functions
};
class Big
{
public:
void foo()
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->foo();
}
void bar(int x)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
VectorOfSmalls[i]->bar(x);
}
// and many more functions
private:
vector<Small*> VectorOfSmalls;
};
我要简化代码,并找到一种方法,不要重复在每一个功能去其他的载体。
我已经考虑过创建一个函数,它接收一个指向函数的指针,并调用向量的每个成员的指针函数。但我不确定在C++中使用函数指针是个好主意。
我也一直在考虑仿函数和functionoids,但它会迫使我为每个函数创建一个类,它听起来像是一种矫枉过正。
另一种可能的解决方案是创建一个接收一个字符串的函数,并调用命令根据字符串:
void Big::call_command(const string & command)
{
for (size_t i = 0; i < VectorOfSmalls.size(); i++)
{
if (command == "foo")
VectorOfSmalls[i]->foo();
else if (command == "bar")
VectorOfSmalls[i]->bar();
}
}
void Big::foo()
{
call_command("foo");
}
但它可能工作慢(不需要创建一个字符串,而不是只是一个函数调用的)如果函数具有不同的签名,也会产生问题。
那么你会推荐什么?我应该离开现在的一切吗?编辑:我只能使用STL而不是提升(旧编译器)。
谢谢埃文。但std :: mem_fn是boost的一部分,而不是STL。也许有另一种方法来使用for_each在我的情况?那么具有不同签名的功能呢? – 2009-01-19 19:07:44
oops,typo:mem_fn是boost的一部分,但std :: mem_fun是STL的一部分。 – 2009-01-19 20:26:49