異なる引数を取る複数の Send メソッドを定義する Session クラスがあります。例えば:
class Session
{
public:
void SendInt(int i);
void SendTwoInts(int i1, int i2);
void SendStringAndInt(const std::string& str, int i);
};
また、すべてのセッションを保持する SessionsManager クラスもあります。
class SessionsManager
{
private:
std::vector<Session*> m_Sessions;
...
};
セッションごとに同じメソッドを呼び出すブロードキャスト メソッドを SessionsManager クラスに追加したいと思います。Session Send メソッドごとに個別のブロードキャスト メソッドを定義するだけの場合、次のように終了します。
class SessionsManager
{
public:
void BroadcastInt(int i) { for(auto it : m_Sessions) { it->SendInt(i); } };
void BroadcastTwoInts(int i1, int i2) { for(auto it : m_Sessions) { it->SendTwoInts(i1, i2); } };
...
};
コピペが多すぎますし、理論的には Send メソッドの数は将来増えるでしょう。もっと賢いものが欲しい。
完璧なシナリオでは、Session メソッドとその引数を引数として取るテンプレート化された Broadcast メソッドがあると想像します。つまり、次のようなものです。
template<typename Method, typename ...Args)
void Broadcast(Method, Args ... args)
{
...
}
ブロードキャストコールは
Broadcast(&Session::SendInt, 2);
Broadcast(&Session::SendTwoInts, 2, 3);
問題は、それが可能かどうか、またブロードキャストを正確に実装する方法がわからないことです。std::function と std::bind について考えていますが、それでもコードをコンパイルできません。
どんなアイデアでも大歓迎です。
- 更新しました
2 つの Send メソッドに同じ引数を使用することは可能ですが、セマンティックは異なります。例えば:
void SendName(const std::string& name);
void SendDescription(const std::string& description);