Title: Usage and usefulness of boost signal . The power of
终极管理员 知识笔记 46阅读
boost is beyond doubt, and the signal function alone can bring great convenience to countless C programmers. Now, there is no need to envy the entrustment and events of C# or Java language (a computer language, especially for creating websites), thanks to the signal of promotion. The usage of the signal is directly coded, and the code is derived from the example ://document/viewsampleforboost. Signal///CopyrightKeithMacDonald2005. Use, modification and//distributionissubjecttobootsoftwarelicense, version //1.0. (see the attached//)//For details, please see # inclusionstrom # includestring # includedboot/signal.hpp # includedboot/bind.hppclassdocument {public:typedef boost 33603360 signal void (bool) signal _ t; typedefboost : signals 3360: connection connection _ t; public : document(){ } connection _ t connect(signal _ t :3360 slot _ function _ typesubscriber)nbs
p; {return m_sig.connect(subscriber);
}
/span>/span>/span>/span>/span>/span>br> void disconnect(connection_t subscriber)
{
subscriber.disconnect();
}
/span>/span>/span>/span>/span>/span>br> void append(const char* s)
{
m_text += s;
m_sig(true);
}
/span>/span>/span>/span>/span>/span>br> const std::string& getText() const/span>/span>/span>/span>/span>/span>br> {
return m_text;
}
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">private:
signal_t m_sig;
std::string m_text;
};
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">class View
{
/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">public:
View(Document& m)
: m_document(m)
{
m_connection = m_document.connect(boost::bind(&View::refresh, this, _1));
}
/span>/span>/span>/span>/span>/span>br> virtual ~View()
{
m_document.disconnect(m_connection);
}
/span>/span>/span>/span>/span>/span>br> virtual void refresh(bool bExtended) const = 0;
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">protected:
Document& m_document;
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">private:
Document::connection_t m_connection;
};
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">class TextView : public View
{
/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">public:
TextView(Document& doc)
: View(doc)
{}
/span>/span>/span>/span>/span>/span>br> virtual void refresh(bool bExtended) const/span>/span>/span>/span>/span>/span>br> {
std::cout << "/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">TextView: /span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">" << m_document.getText() << std::endl;
}
};
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">class HexView : public View
{
/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">public:
HexView(Document& doc)
: View(doc)
{}
/span>/span>/span>/span>/span>/span>br> virtual void refresh(bool bExtended) const/span>/span>/span>/span>/span>/span>br> {
const std::string& s = m_document.getText();
/span>/span>/span>/span>/span>/span>br> std::cout << "/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">HexView:/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">";
/span>/span>/span>/span>/span>/span>br> for (std::string::const_iterator it = s.begin(); it != s.end(); /span>it)
std::cout << '/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)"> /span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">' << std::hex << static_cast<int>(*it);
/span>/span>/span>/span>/span>/span>br> std::cout << std::endl;
}
};
/span>/span>/span>/span>/span>/span>br/span>/span>/span>/span>/span>/span>span style="color: rgba(0, 0, 255, 1)">int main(int argc, char* argv)
{
Document doc;
TextView v1(doc);
HexView v2(doc);
/span>/span>/span>/span>/span>/span>br> doc.append(argc == 2 ? argv[1] : "/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">Hello world!/span>/span>/span>/span>/span>/span>span style="color: rgba(128, 0, 0, 1)">");
return 0;
}
