0

我在地图中有一组对象指针,在几个地方我需要遍历该集合并调用每个对象的成员函数。

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

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

回答:事实证明这很容易,修改了我原来的例子,使其按需要工作:

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));
}
4

1 回答 1

0

这是你想要做的:

boost::bind(&X::f, ref(x), _1)(i);      // x.f(i)

取自这里

如果你想拥有不同参数的不同函数,你可以有一个枚举来标识函数(你传递给invokeMember),传递可变数量的参数给invokeMember,并在那里调用bind。

与可变数量的参数相比,最好有一个包含所有可能参数的类(或传递一个void *指向定义该函数调用参数的类并使用动态转换的类)。

于 2012-11-29T07:23:47.707 回答