沒有花費很長時間審查boost源代碼,有人可以給我一個如何實施boost綁定的簡要說明嗎?增強綁定是如何在幕後工作的?
30
A
回答
24
我喜歡這片bind
來源:
template<class R, class F, class L> class bind_t
{
public:
typedef bind_t this_type;
bind_t(F f, L const & l): f_(f), l_(l) {}
#define BOOST_BIND_RETURN return
#include <boost/bind/bind_template.hpp>
#undef BOOST_BIND_RETURN
};
告訴你幾乎所有你需要知道的,真的。
bind_template
標題擴展爲內嵌operator()
定義的列表。例如,最簡單的:
result_type operator()()
{
list0 a;
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
我們可以在這一點上看到BOOST_BIND_RETURN
宏展開return
太行更像return l_(type...)
。
的一個參數的版本是在這裏:
template<class A1> result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
BOOST_BIND_RETURN l_(type<result_type>(), f_, a, 0);
}
這是非常相似的。
listN
類是參數列表的包裝。這裏有很多深刻的魔法,但我並沒有真正理解太多。他們還重載了operator()
,稱之爲神祕的unwrap
功能。忽略一些特定的編譯器過載,它不會做了很多:
// unwrap
template<class F> inline F & unwrap(F * f, long)
{
return *f;
}
template<class F> inline F & unwrap(reference_wrapper<F> * f, int)
{
return f->get();
}
template<class F> inline F & unwrap(reference_wrapper<F> const * f, int)
{
return f->get();
}
的命名規則似乎是:F
是函數參數bind
的類型。 R
是返回類型。 L
往往是參數類型的列表。還有很多複雜因素,因爲對於不同數量的參數,重複次數不會少於9次。最好不要多說這些。
0
我認爲這是一個模板類,它爲要綁定的參數聲明一個成員變量,爲其餘參數聲明一個成員變量,併爲其重載。
2
順便說一句,如果bind_t
被摺疊並簡化了通過包括boost/bind/bind_template.hpp
,它變得更容易理解這樣的:
template<class R, class F, class L>
class bind_t
{
public:
typedef bind_t this_type;
bind_t(F f, L const & l): f_(f), l_(l) {}
typedef typename result_traits<R, F>::type result_type;
...
template<class A1>
result_type operator()(A1 & a1)
{
list1<A1 &> a(a1);
return l_(type<result_type>(), f_, a, 0);
}
private:
F f_;
L l_;
};
相關問題
- 1. 如何增強::綁定到boost :: math :: pdf?
- 2. 重定向增強綁定
- 3. 增強現實如何工作?
- 4. python綁定,它是如何工作的?
- 5. JQuery的.click()如何在幕後工作?
- 6. 後增量如何在c中工作?
- 7. 顫振 - 它在幕後如何工作?
- 8. Django框架如何在幕後工作?
- 9. neo4j索引如何在幕後工作?
- 10. CGPoint變量如何在幕後工作?
- 11. asp.net mvc3如何在幕後工作
- 12. CreateRemoteThread如何在幕後工作?
- 13. Drop語句如何在幕後工作?
- 14. SQL參數化:這是如何在幕後工作的?
- 15. python:如何綁定工作
- 16. LINQ中的OrderBy如何工作(幕後)?
- 17. WPF綁定替代品/增強
- 18. 強類型DataContext是如何工作的?
- 19. 強制是如何工作的?
- 20. 指針遞增是如何工作的
- 21. 在這種情況下後期靜態綁定如何工作?
- 22. 工作燈下的增強現實
- 23. ActionScript中的綁定如何工作?
- 24. JSF中的'綁定'如何工作?
- 25. [ngModel]中的值綁定如何工作?
- 26. 如何在Emacs中強制綁定?
- 27. Silverlight:如何在設置DataContext屬性後強制綁定
- 28. Selenium的幕後工作
- 29. 如何增加屏幕的Android(安卓工作室設備)
- 30. 負載和性能測試工具如何在幕後工作?
這似乎並不簡單,我... 爲什麼是`#定義BOOST_BIND_RETURN返回'必要? 爲什麼不只是返回? – Ha11owed 2011-09-10 14:33:00