Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/135.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用boost的集合中的成员函数代理_C++_Boost - Fatal编程技术网

C++ 使用boost的集合中的成员函数代理

C++ 使用boost的集合中的成员函数代理,c++,boost,C++,Boost,我在一个映射中有一个对象指针集合,在几个地方我需要迭代该集合并调用每个对象的成员函数 目前,对于我需要在集合中的每个元素上调用的每个成员函数,我正在添加一个代理函数,该函数在调用关联成员的集合上进行迭代 我想知道是否可以使用boost在collection类中创建一个模板函数,在一般情况下它可以为我处理这个问题 答:事实证明这很简单,修改了我的原始示例,使其能够按预期工作: class Object { public: void func1(); void func2(int a

我在一个映射中有一个对象指针集合,在几个地方我需要迭代该集合并调用每个对象的成员函数

目前,对于我需要在集合中的每个元素上调用的每个成员函数,我正在添加一个代理函数,该函数在调用关联成员的集合上进行迭代

我想知道是否可以使用boost在collection类中创建一个模板函数,在一般情况下它可以为我处理这个问题

答:事实证明这很简单,修改了我的原始示例,使其能够按预期工作:

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占位符。