如何使用 boost::bind 将成员函数绑定到任何对象
How to use boost::bind to bind a member-function to ANY object
我正在尝试使用 boost::bind boost::function 实现某些目标,但无法实现。
我看到 how to bind a member function 一个对象,其中包含一些稍后用作 void/void 函数的参数。但是如何将它绑定到任何对象。
我想要一个指向我的 class 的成员函数的指针(可以与 class 的任何对象一起使用)和绑定参数:
#include "boost/function.hpp"
#include "boost/bind.hpp"
class A
{
public:
A() {}
void func1( int i );
void func2( const std::string& s );
static void dispatch( std::vector<A>& vect, /* boost::function parameter "func" */ ) // what parameter should I set?
{
for ( std::vector<A>::iterator iter = vect.begin();
iter != vect.end();
++iter )
{
// what syntax should I use?
//(*iter).(*func)();
}
}
};
int main()
{
std::vector<A> vect;
// have func1(3) be called for all objects contained in vect
// this does not compile because boost expects an object to bind the function to
A::dispatch( vect, boost::bind( boost::mem_fn(&A::func1), 3 ) );
// have func2("hello") be called for all objects contained in vect
// this does not compile because boost expects an object to bind the function to
A::dispatch( vect, boost::bind( boost::mem_fn(&A::func2), "hello" ) );
}
我试过了:
static void dispatch( const std::vector<A>& vect, boost::_mfi::mf0<void, A> func )
...
boost::_mfi::mf1<void,A,int> func( boost::mem_fn(&A::func1) );
boost::_mfi::mf0<void,A> binded( boost::bind( func, 3 ) );
A::dispatch( vect, binded );
但是编译失败:
Erreur 1 error C2664: 'boost::_mfi::mf0<R,T>::mf0(void (__thiscall A::* )(void))' : impossible de convertir le paramètre 1 de 'boost::_bi::bind_t<R,F,L>' en 'void (__thiscall A::* )(void)' b:\dev\vobs_bci\public\lib\btle\src\btle\notifierdispatcher.cpp 99
注意:不幸的是我还没有使用 C++11,所以请不要 auto
...;-)
许多细微的调整,大部分的简化:
Live On Coliru (c++03)
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <vector>
#include <iostream>
class A
{
public:
A() {}
void func1(int i) const { std::cout << __PRETTY_FUNCTION__ << "(" << i << ")\n"; }
void func2(const std::string& s) const { std::cout << __PRETTY_FUNCTION__ << "(" << s << ")\n"; }
static void dispatch(const std::vector<A>& vect, boost::function<void(A const&)> const& func)
{
for ( std::vector<A>::const_iterator iter = vect.begin();
iter != vect.end();
++iter )
{
func(*iter);
}
}
};
int main()
{
std::vector<A> vect(3);
A::dispatch(vect, boost::bind(&A::func1, _1, 3));
A::dispatch(vect, boost::bind(&A::func2, _1, "hello"));
}
备注
- 使用
boost::function<void(A const&)>
因为你取消引用 const 迭代器
- 使用
A::dispatch(vect, boost::bind(&A::func1, _1, 3));
标记func1
和func2
const
void func1(int i) const;
void func2(std::string const& i) const;
输出:
void a::func1(int) const(3)
void a::func1(int) const(3)
void a::func1(int) const(3)
void a::func2(const std::string &) const(hello)
void a::func2(const std::string &) const(hello)
void a::func2(const std::string &) const(hello)
我正在尝试使用 boost::bind boost::function 实现某些目标,但无法实现。
我看到 how to bind a member function 一个对象,其中包含一些稍后用作 void/void 函数的参数。但是如何将它绑定到任何对象。
我想要一个指向我的 class 的成员函数的指针(可以与 class 的任何对象一起使用)和绑定参数:
#include "boost/function.hpp"
#include "boost/bind.hpp"
class A
{
public:
A() {}
void func1( int i );
void func2( const std::string& s );
static void dispatch( std::vector<A>& vect, /* boost::function parameter "func" */ ) // what parameter should I set?
{
for ( std::vector<A>::iterator iter = vect.begin();
iter != vect.end();
++iter )
{
// what syntax should I use?
//(*iter).(*func)();
}
}
};
int main()
{
std::vector<A> vect;
// have func1(3) be called for all objects contained in vect
// this does not compile because boost expects an object to bind the function to
A::dispatch( vect, boost::bind( boost::mem_fn(&A::func1), 3 ) );
// have func2("hello") be called for all objects contained in vect
// this does not compile because boost expects an object to bind the function to
A::dispatch( vect, boost::bind( boost::mem_fn(&A::func2), "hello" ) );
}
我试过了:
static void dispatch( const std::vector<A>& vect, boost::_mfi::mf0<void, A> func )
...
boost::_mfi::mf1<void,A,int> func( boost::mem_fn(&A::func1) );
boost::_mfi::mf0<void,A> binded( boost::bind( func, 3 ) );
A::dispatch( vect, binded );
但是编译失败:
Erreur 1 error C2664: 'boost::_mfi::mf0<R,T>::mf0(void (__thiscall A::* )(void))' : impossible de convertir le paramètre 1 de 'boost::_bi::bind_t<R,F,L>' en 'void (__thiscall A::* )(void)' b:\dev\vobs_bci\public\lib\btle\src\btle\notifierdispatcher.cpp 99
注意:不幸的是我还没有使用 C++11,所以请不要 auto
...;-)
许多细微的调整,大部分的简化:
Live On Coliru (c++03)
#include "boost/function.hpp"
#include "boost/bind.hpp"
#include <vector>
#include <iostream>
class A
{
public:
A() {}
void func1(int i) const { std::cout << __PRETTY_FUNCTION__ << "(" << i << ")\n"; }
void func2(const std::string& s) const { std::cout << __PRETTY_FUNCTION__ << "(" << s << ")\n"; }
static void dispatch(const std::vector<A>& vect, boost::function<void(A const&)> const& func)
{
for ( std::vector<A>::const_iterator iter = vect.begin();
iter != vect.end();
++iter )
{
func(*iter);
}
}
};
int main()
{
std::vector<A> vect(3);
A::dispatch(vect, boost::bind(&A::func1, _1, 3));
A::dispatch(vect, boost::bind(&A::func2, _1, "hello"));
}
备注
- 使用
boost::function<void(A const&)>
因为你取消引用 const 迭代器 - 使用
A::dispatch(vect, boost::bind(&A::func1, _1, 3));
标记
func1
和func2
constvoid func1(int i) const; void func2(std::string const& i) const;
输出:
void a::func1(int) const(3)
void a::func1(int) const(3)
void a::func1(int) const(3)
void a::func2(const std::string &) const(hello)
void a::func2(const std::string &) const(hello)
void a::func2(const std::string &) const(hello)