我有一個類有另一個類對象的向量作爲成員。在這個類的很多功能我必須做對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