我有一个 Session 类,它定义了多个接收不同参数的 Send 方法。例如:
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); } };
...
};
复制粘贴太多了,理论上发送方法的数量将来会增加。我想要更聪明的东西。
在完美的场景中,我想象有模板化的 Broadcast 方法,它将 Session 方法及其参数作为参数,例如:
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);