C# 內建 event 關鍵字提供發布-訂閱模式,C++ 無對應語言特性,但可透過模板 + 運算子多載模擬核心功能。
template
class event {
private:
Handler handler_;
protected:
// 可覆寫的 add/remove 存取器 (對應 C# event accessors)
virtual void add(const Handler& h) { handler_ = h; }
virtual void remove(const Handler& h) { if (h == handler_) handler_ = nullptr; }
public:
event() : handler_(nullptr) {}
// += 訂閱
event& operator+=(const Handler& h) { add(h); return *this; }
// -= 退訂
event& operator-=(const Handler& h) { remove(h); return *this; }
// 隱式轉換為 Handler (對應 C# 直接呼叫 event)
operator Handler() const { return handler_; }
};
// 使用 typedef 定義委派型別 (對應 C# delegate)
using EventHandler = void(*)();
// 含參數版本
using EventHandlerEx = void(*)(int, const std::string&);
class MyClass {
public:
MyClass() = default;
// 宣告事件 (對應 C#: public event EventHandler AEvent;)
event AEvent;
// 觸發事件
void FireEvent() {
if (AEvent != nullptr) {
// C++ 需要顯式轉換呼叫
static_cast(AEvent)();
}
}
};
void MyEventHandler() {
std::printf("This is an event!\n");
}
int main() {
MyClass obj;
obj.AEvent += MyEventHandler; // 訂閱
obj.FireEvent(); // 觸發 -> 輸出事件訊息
obj.AEvent -= MyEventHandler; // 退訂
obj.FireEvent(); // 無輸出
return 0;
}
| 特性 | C# event | C++ 模擬版 |
|---|---|---|
| 語言支援 | 關鍵字原生支援 | 模板類別 + 運算子多載 |
| 宣告語法 | event EventHandler E; | event |
| 訂閱/退訂 | += / -= | operator+= / operator-= |
| 觸發呼叫 | E() 直接呼叫 | static_cast 需轉換 |
| 多播支援 | 內建多播委派 | 單一處理器 (需自行擴展) |
| add/remove 存取器 | add/remove 關鍵字 | 虛擬函式 add/remove |
| 型別安全 | 編譯期完整檢查 | 模板參數提供檢查 |