C++ 使用boost的集合中的成员函数代理
我在一个映射中有一个对象指针集合,在几个地方我需要迭代该集合并调用每个对象的成员函数 目前,对于我需要在集合中的每个元素上调用的每个成员函数,我正在添加一个代理函数,该函数在调用关联成员的集合上进行迭代 我想知道是否可以使用boost在collection类中创建一个模板函数,在一般情况下它可以为我处理这个问题 答:事实证明这很简单,修改了我的原始示例,使其能够按预期工作:C++ 使用boost的集合中的成员函数代理,c++,boost,C++,Boost,我在一个映射中有一个对象指针集合,在几个地方我需要迭代该集合并调用每个对象的成员函数 目前,对于我需要在集合中的每个元素上调用的每个成员函数,我正在添加一个代理函数,该函数在调用关联成员的集合上进行迭代 我想知道是否可以使用boost在collection类中创建一个模板函数,在一般情况下它可以为我处理这个问题 答:事实证明这很简单,修改了我的原始示例,使其能够按预期工作: class Object { public: void func1(); void func2(int a
class Object
{
public:
void func1();
void func2(int a);
};
class ObjectCollection : public std::map<std::string, Object*>
{
public:
template <typename Func>
void invokeMember(Func func)
{
for (iterator it = begin(); it != end(); ++it)
{
it->second->func();
}
}
};
void test()
{
ObjectCollection collection;
// ...
collection.invokeMember(boost::bind(&Object::func1, _1));
collection.invokeMember(boost::bind(&Object::func2, _1, 42));
}
类对象
{
公众:
void func1();
无效函数2(int a);
};
类ObjectCollection:public std::map
{
公众:
模板
void invokeMember(Func Func)
{
for(迭代器it=begin();it!=end();++it)
{
it->second->func();
}
}
};
无效测试()
{
对象收集;
// ...
invokeMember(boost::bind(&Object::func1,_1));
invokeMember(boost::bind(&Object::func2,_1,42));
}
这就是您想要做的:
boost::bind(&X::f, ref(x), _1)(i); // x.f(i)
取自
如果希望使用不同参数的不同函数,可以使用枚举来标识函数(传递给invokeMember),将可变数量的参数传递给InvokeMber,并在其中调用bind
与其使用数量可变的参数,不如使用一个包含所有可能参数的类(或者传递一个
void*
,该类指向一个定义该函数调用参数的类,并使用动态强制转换).谢谢你的回复-我会尝试一下,看看我能从哪里得到它。事实证明,它非常简单,完全按照我的要求工作,我只需要在绑定中添加_1占位符。