我有一個Session類,它定義了多個採用不同參數的Send方法。例如:作爲參數傳遞的C++調用方法
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類,每個會話調用相同的方法。如果我只是定義每個會話發送方法的獨立的廣播方法我將結束這樣的:
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); } };
...
};
實在是太多了複製,粘貼和理論上發送方法將在未來增長的數量。我想要更聰明的東西。
在理想情況下我想象一下,有模板廣播方法,它採用會話方法及其作爲參數的參數,即是這樣的:
template<typename Method, typename ...Args)
void Broadcast(Method, Args ... args)
{
...
}
和廣播呼叫將
Broadcast(&Session::SendInt, 2);
Broadcast(&Session::SendTwoInts, 2, 3);
問題是我不確定是否有可能以及如何實施廣播。我在思考std :: function和std :: bind,但仍然無法編譯我的代碼。
歡迎任何想法。
- 修訂
它可能有2種相同的參數,但有不同的語義發送方法。例如:
void SendName(const std::string& name);
void SendDescription(const std::string& description);
我不明白你爲什麼不是重載發送方法? – 2013-03-09 15:12:12
因爲可能有2個Send方法具有相同的參數但語義不同。例如SendName(const std :: string&name)和SendDescription(const std :: string&description) – 2013-03-09 15:18:03
在你的例子中,你永遠不會說'sendName'和'sendDescription'你說'sendInt','send2Ints'等等......你做一個你永遠不應該做的手動名字mangaling。它的編譯器應該這樣做。 – 2013-03-09 15:19:42