Posted on 2008-03-28 11:37
RichardHe 閱讀(362)
評論(0) 編輯 收藏 引用
(1) 現在的類庫最多可以支持9個參數。
(2)在綁定一個成員函數時,bind 表達式的第一個參數必須是成員函數所在類的實例!理解這個規則的最容易的方法是,這個顯式的參數將取
替隱式的 this ,被傳遞給所有的非靜態成員函數。細心的讀者將會留意到,實際上這意味著對于成員函數的綁定器來說,只能支持八個參數
,因為第一個要用于傳遞實際的對象。
(3)當我們傳遞某種類型的實例給一個 bind 表達式時,它將被復制,除非我們顯式地告訴 bind 不要復制它。要避免復制,我們必須告訴
bind 我們想傳遞引用而不是它所假定的傳值。我們要用 boost::ref 和 boost::cref (分別用于引用和 const 引用)來做到這一點,它們也是
Boost.Bind 庫的一部分。還有一種避免復制的方法;就是通過指針來傳遞參數而不是通過值來傳遞。
不然對象會被構造很多次.效率會降低很多,我已經實踐過了.析構也會一樣....代碼如下:
class Trace
{
public:
Trace() {std::cout<<"constructor!"<<endl;}
Trace(const Trace& other)
{
std::cout<<"constructor by other!"<<endl;
}
Trace& operator =(const Trace& other)
{
std::cout <<"tracer& tracer::operator=(const tracer& other)\n";
return *this;
}
~Trace(){std::cout << "tracer::~tracer()\n"; }
void print(const std::string& s)const
{
std::cout << s << endl;
}
};
void main()
{
Trace trace;//Trace為類,trace為對象
boost::bind(&Trace::print,trace,_1)(std::string("CppBlog"));
Trace t1;//Trace為類,t1為對象
boost::bind(&Trace::print,boost::ref(t1),_1)(std::string("RichardHe"));
}
結果如下:
//boost::bind(&Trace::print,trace,_1)(std::string("CppBlog"));
constructor!
constructor by other!
constructor by other!
constructor by other!
tracer::~tracer()
constructor by other!
tracer::~tracer()
tracer::~tracer()
CppBlog
tracer::~tracer()
// boost::bind(&Trace::print,boost::ref(t1),_1)(std::string("RichardHe"));
constructor!
RichardHe
tracer::~tracer()
tracer::~tracer()
(4) 通過 Boost.Bind, 你可以象使用非虛擬函數一樣使用虛擬函數,即把它綁定到最先聲明該成員函數為虛擬的基類的那個虛擬函數上。這
個綁定器就可以用于所有的派生類。如果你綁定到其它派生類,你就限制了可以使用這個綁定器的類。
(5)bind還可以綁定成員變量。