2012-12-11 54 views
4

我主要是一個.NET程序員,工作在C++項目上,並試圖確定處理使用Action和Function模板類型的委託的等效方法。我在.NET代碼中使用代理作爲事件和回調。我的C++項目使用智能指針和與C#程序相同的代理設計模式。處理這種情況的最佳方法是什麼?我不清楚如何傳遞和維護一個函數指針,該函數指針也跟蹤智能指針並潛在地刪除底層對象,因爲事件容器使用弱引用。圖書館需要是多平臺的,因此使用CLR不幸是不可取的。當C++使用智能指針時,C#委託相當於

+0

您能否提供C#代碼以供參考? –

+0

你使用什麼樣的智能指針? – Geoffroy

+0

根據情況,智能指針是一個shared_ptr或weak_ptr。 C#代碼非常標準,我不認爲特定的示例會有幫助。 – John

回答

1

你在找什麼是綁定到現有對象的方法指針,就是這樣嗎?

你應該看看boost::bind。如果您的環境支持它,如果它支持C++ 11,則還可以使用std::tr1::bind或甚至std::bind

這說明你要的是這個例子:

struct X 
{ 
    bool f(int a); 
}; 
X x; 
shared_ptr<X> p(new X); 
int i = 5; 

bind(&X::f, ref(x), _1)(i);  // x.f(i) 
bind(&X::f, &x, _1)(i);   //(&x)->f(i) 
bind(&X::f, x, _1)(i);   // (internal copy of x).f(i) 
bind(&X::f, p, _1)(i);   // (internal copy of p)->f(i) 

最後兩個例子是很有趣,他們生產的「自足」的函數對象。綁定(& X :: f,x,_1)存儲x的副本。 bind(& X :: f,p,_1)存儲p的一個副本,並且由於p是一個boost :: shared_ptr,函數對象保留對其X實例的引用並且即使在p超出作用域時仍然有效或重置()。

boost::bindstd::tr1::bindstd::bind之間的差異,我讓你看this other question on SO.

+0

boost :: bind的問題在於我正在開發一個共享庫,並且客戶端應用程序boost版本和庫boost版本之間可能存在boost版本衝突。有沒有一種乾淨的方法來處理這種情況? – John

+1

這是一種乾淨的方式,您可以設置增強版本的要求。這種功能不會改變超時(至少低概率)。你是否考慮過這只是一個標題?而boost :: bind這個事實已經被集成到了新的標準C++ 11中?事先是TR1的一部分? – Geoffroy

+0

我需要使用boost :: signals來獲取C#類型「事件」附帶的事件功能和生命週期控制。這些日子被認爲是一種合理的依賴嗎? – John