如何使用 Boost.Func
//z 2014-07-24 14:53:32 L.160'32788 BG57IV3@XCL T491489982 .K.F916674775 [T6,L181,R3,V64]
1. 概述
Boost.Func 允许你创建各种类型的函数指针变量。
Boost.Bind 能够动态bind一个函数到函数指针变量。
2. 声明一个boost::function 变量
声明变量的关键点是指明函数指针的返回值类型以及参数类型。
2.1 形式如下:
boost::function<RETURN_TYPE(PARAM_TYPE_1, PARAM_TYPE_N)> boostFunction;
2.2 例子:
boost::function<void()> voidFunction; // returns void and
// takes no parameters
boost::function<int(int, char**)> mainFunction; // same signature as
// standard main()
boost::function<void(std::string)> stringFunction; // returns void and
// takes a string
3. 检查一个 boost::function 变量是否能够被安全调用
boost::function 可能包含或未包含一个可调用的函数指针。调用一个未包含合法可调用函数指针的function pointer将导致未定义的行为。下面演示了如何使用检查一个boost::function 变量的合法性:
boost::function<void()> boostFunction;
if ( boostFunction ) // contains valid method
{
}
if ( boostFunction.empty() ) // does NOT contain valid method
{
}
3.1 empty() method 能够用于判断wrapper是否为null
3.2 使用完毕之后的清除 : fp = 0; 或者调用 fp.clear();
4. 调用 boost::function 变量
// some variables
int number = 0;
std::string aString("text");
float aFloat = 0.f;
// some function pointers
boost::function<void()> voidFunction;
boost::function<int(std::string)> stringAndIntFunction;
boost::function<void(float, int)> floatAndIntFunction;
// call the functions
voidFunction();
number = stringAndIntFunction(aString);
floatAndIntFunction(aFloat, number);
//z 2014-07-24 14:53:32 L.160'32788 BG57IV3@XCL T491489982 .K.F916674775 [T6,L181,R3,V64]
5. 封装一个 command object
/// command object
class command
{
private:
boost::function<void ()> _f;
public:
command()
{
;
}
command(boost::function<void ()> f) : _f(f)
{
;
}
template <typename T> void setFunction (T t)
{
_f = t ;
}
void execute()
{
if(!_f.empty())
_f();
}
};
6. boost :: bind 初始化函数指针
能够为任何function object绑定参数。
理解bind的关键是placeholders,placeholders定义为_1到_9,你在你通常使用argument的地方使用它们。
6.1 bind到一个free fucntion (独立函数)
void comm (std::string str) {…}
(boost::bind(&comm, _1)) (“Isn’t this fun?”);
6.2 bind到一个member function
bind到一个member function也是可以的。只是必须考虑传递隐式的this reference到所有的非静态成员函数。
inFlight fly;
(boost::bind (&comm, _1,_2)) (fly, “Isn’t this fun?”);
6.2.1 绑定一个无参数的成员函数
boost::bind(&Final::decAlt, fa)
6.3 例子:
// PART 2
// create a series of commands and stuff them into a container to be sequenced later
vector<boost::shared_ptr<command> > v;
boost::shared_ptr<command> spCmd1(new command(boost::bind(&Final::incAlt, final)));
boost::shared_ptr<command> spCmd2(new command(boost::bind(&Final::decSpeed, final)));
boost::shared_ptr<command> spCmd3(new command(boost::bind(&Final::decAlt, final)));
v.push_back(spCmd1);
v.push_back(spCmd2);
v.push_back(spCmd3);
// run the command sequence
for_each(v.begin(), v.end(), boost::bind(&command::execute, _1));
return 0;
//z 2014-07-24 15:18:10 L.160'31310 BG57IV3@XCL T3039420616.K.F916674775 [T8,L231,R4,V79]
6.4 Using std::bind1st
and std::mem_fun
together one can bind the object of a pointer-to-member function for use with Boost.Function:
boost::function<int (int)> f;
X x;
f = std::bind1st( std::mem_fun(&X::foo), &x);
f(5); // Call x.foo(5)
6.5 references to function objects
stateful_type a_function_object; boost::function
<int (int)> f;
f = boost::ref
(a_function_object);
boost::function
<int (int)> f2(f); f
will not make a copy of a_function_object
, nor will f2
when it is targeted to f
's reference to a_function_object.
这里f和f2都不会为 a_function_object 做一份拷贝,如果其target是一个指向 a_function_object 的引用时。
//z 2014-07-24 15:55:35 L.160'29065 BG57IV3@XCL T3667519838.K.F916674775 [T9,L242,R4,V90]
@IS2120#CNBLOGS.T2169364049[T1,L65,R1,V259]:备忘
$ € ₤ ₭ ₪ ₩ ₮ ₦ ₱ ฿ ₡ ₫ ﷼ ¥ ﷼ ₫ ₡ ฿ ₱ ₦ ₮ ₩ ₪ ₭ ₤ € $