別のクラス オブジェクトのベクトルをメンバーとして持つクラスがあります。このクラスの多くの関数では、ベクター内のすべてのオブジェクトに対して同じ操作を行う必要があります。
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++ で関数へのポインターを使用することが良い考えかどうかはわかりません。
functor とfunctionoidについても考えていますが、関数ごとにクラスを作成する必要があり、やり過ぎのように思えます。
別の可能な解決策は、文字列を受け取り、文字列に従ってコマンドを呼び出す関数を作成することです。
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のみを使用できます。