日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

boost function对象

發(fā)布時(shí)間:2024/4/15 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 boost function对象 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

本文根據(jù)boost的教程整理。

主要介紹boost function對象的用法。

boost function

boost function是什么

boost function是一組類和模板組合,用于包裝各種函數(shù)。從功能上,它類似于函數(shù)指針,但是比函數(shù)指針的功能更強(qiáng)大。


使用boost function,必須包含頭文件

?

#include <boost/function.hpp>


除了頭文件外,不需要額外的庫。

?

注意,boost function有兩種形式:一種為推薦形式;另外一種為可移植形式。推薦形式的語法更加簡潔;可移植形式的可移植性好,但是語法羅嗦。由于目前的gcc/vc的版本都已經(jīng)能夠使用推薦形式了,因此,可移植形式就不在描述。有興趣的可以參閱boost相關(guān)文檔。

boost function 基本用法

例如,有一個(gè)函數(shù)

?

float int_div(int x, int y) {return ((float)x)/y; }


我們可以這樣使用

?

?

boost::function<float (int x, int y)> f;f = int_div;std::cout<< f(5,3) << std::endl;


可以看到,它的用法和函數(shù)指針很相似的。

?

當(dāng)然,boost::function不止這些,請看下面的函數(shù)對象:

?

struct int_add {float operator()(int x, int y) {return (float)(x + y);} };


上面的 boost::function<float (int x, int y)> f 聲明的f對象,仍舊可以保存int_add:

?

?

f = int_add();std::cout << "f add : "<< f(10,20) << std::endl;

?

?

另外,boost::function還可以用來判斷函數(shù)是否為空

?

if(f)std::cout << " f is ok!"<< std::endl;


要清空f,可以使用

?

?

f = 0;if(!f)std::cout << "f is cleard!" << std::endl;

?

?

針對成員函數(shù)

成員函數(shù),也可以被綁定,如有類 struct X {int foo(int x) {std::cout << "X " << this << " foo x="<<x << std::endl;return x + 100;}; };
可以這樣使用 boost::function<int (X*, int)> mf;mf = &X::foo;X x;mf(&x, 5);

和bind同時(shí)使用

在需要包裝參數(shù)的場合,我們可以配合boost::bind一起使用。 首先,加入boost::bind的頭文件 #include <boost/bind.hpp> 這樣使用 boost::function<int (int)> mbf;mbf = bind(&X::foo, &x, _1);mbf(10);
bind將x的指針保存在function對象中。


function factory

function factory是一個(gè)封裝類工廠的模板。它有兩種,一種是value_factory,一種是factory。
boost::factory<T*>()(arg1,arg2,arg3) // same as new T(arg1,arg2,arg3)boost::value_factory<T>()(arg1,arg2,arg3) // same as T(arg1,arg2,arg3)

使用function factory的原因

我們考慮這樣的場景:使用 抽象工廠模式,有一個(gè)接口,有若干個(gè)實(shí)現(xiàn),通常的做法是這樣的: //聲明接口 class Interface { public:virtual void print(int a) = 0; //接口函數(shù) }; //聲明抽象工廠 class Interface_Factory { public:virtual Interface * create() = 0; };
然后,我們有若干個(gè)實(shí)現(xiàn) class ImplA : public Interface { public:virtual void print(int a) {std::cout << "== A == a=" << a << std::endl;} }; //提供ImplA的類工廠 class ImplA_Factory : public Interface_Factory { public:Interface * create() { return new ImplA(); }static ImplA_Factory _implAFactory; }; ImplA_Factory ImplA_Factory::_implAFactory;//同理,ImplB的實(shí)現(xiàn)class ImplB : public Interface { public:virtual void print(int a) {std::cout << "== B == a=" << a << std::endl;} }; //提供ImplB的類工廠 class ImplB_Factory : public Interface_Factory { public:Interface * create() { return new ImplB(); }static ImplB_Factory _implBFactory; }; ImplB_Factory ImplB_Factory::_implBFactory; 如果你要使用它,就需要這些寫 std::map<std::string, Interface_Factory*> factories;int main() {factories["A"] = &ImplA_Factory::_implAFactory;factories["B"] = &ImplB_Factory::_implBFactory; ..... }
如果仔細(xì)觀察下,就會(huì)發(fā)現(xiàn),實(shí)際上,ImplA_Factory和ImplB_Factory的內(nèi)容幾乎都一樣。但是卻寫了不少重復(fù)性的代碼。factory就是解決該問題的。

factory的解決之道

使用boost::factory,是完全不需要定義Interface_Factory接口和對應(yīng)的實(shí)現(xiàn)的,我們定義一個(gè)boost::function對象,替代Interface_Factory typedef boost::function< I *() > I_factory; //替代Interface_Factory的定義 用boost::factory替代ImplA_Factory和ImplB_Factory: std::map<std::string, I_factory> factories; ....factories["A"] = boost::factory<ImplA*> (); //等價(jià)于 &ImplA_Factory::_ImplAFactory;factories["B"] = boost::factory<ImplB*> (); //等價(jià)于 &ImplB_Factory::_ImplBFactory;
在使用的時(shí)候,與普通方法絲毫不差,如 void run_interface(const char* name) {I_factory factory = factories[name];if(!factory){ std::cout<<"factory " << name << " is not exist" << std::endl;return;} I *i = factory();i->print(100);delete i; } 通過判斷factory的函數(shù)是否為空,就可以知道對應(yīng)的類實(shí)現(xiàn)是否存在。我們可以這樣簡單的使用 run_interface("A");run_interface("B");run_interface("C"); 由于"C"對象不存在,因此,將打印 "factory C is not exist"的信息。

OverloadedFunction

考慮下面的代碼 const std::string& identity_s(const std::string& x) // Function (as pointer).{ return x; }int identity_i_impl(int x) { return x; } int (&identity_i)(int) = identity_i_impl; // Function reference.double identity_d_impl(double x) { return x; } boost::function<double (double)> identity_d = identity_d_impl; // Functor.
在調(diào)用他們的時(shí)候,必須使用各自的函數(shù)名:identity_i, indentity_s, indentity_d; 例如 BOOST_TEST(identity_s("abc") == "abc"); BOOST_TEST(identity_i(123) == 123); BOOST_TEST(identity_d(1.23) == 1.23);
但是,使用OverlaodedFunction,就可以使用統(tǒng)一的名字identity來調(diào)用了: boost::overloaded_function<const std::string& (const std::string&), int (int), double (double) > identity(identity_s, identity_i, identity_d);// All calls via single `identity` function. BOOST_TEST(identity("abc") == "abc"); BOOST_TEST(identity(123) == 123); BOOST_TEST(identity(1.23) == 1.23);


?

?

轉(zhuǎn)載于:https://www.cnblogs.com/snake-hand/p/3141026.html

總結(jié)

以上是生活随笔為你收集整理的boost function对象的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。