如何将泛型方法传递给静态函数

how to pass a generic method to a static function

我需要对作为静态成员存储在 class 本身中的向量的每个元素调用成员函数。

要用 ptfs 做到这一点,我应该写很多代码,但我很确定有一个 <functional> 机制可以帮助我。

语言是c++03 (vs2010)

示例:

class C
{
    static std::vector<C*> pool;

    void a(){}
    void b(){}
    void c(){}

    static void Call( anymethod am )
    {
        for(int i=0;i<(int)pool.size();i++)
        {
            pool[i]->am();
        }
    }
}`
std::vector<C*> C::pool;

几周前我做了一些类似于你想做的事情。在绑定成员函数时,我将使用 std::placeholders::_1 作为 &instance 参数:http://en.cppreference.com/w/cpp/utility/functional/placeholders

基本上,成员函数会悄悄地传递一个'this' 指针指向您通常使用std::bind 绑定的函数。我尝试改用 _1 占位符,然后调用 f(&instance) 并且成功了。

然而,我改变了策略并采取了不同的方法:

#include <functional>
class C
{
    static std::vector<C*> pool;

    void a(){}
    void b(){}
    void c(){}

    static void Call( const std::function<void(C*)>& func )
    {
        for(int i=0;i<(int)pool.size();i++)
        {
            func(pool[i]);
        }
    }
}

并传递了调用特定成员函数的函数:

Call( [=](C* obj){
    obj->am();  // change this to whatever member function you want to call
} );

我为此使用 MSVC2010

使用指向成员函数的指针,它是语言的一部分(不需要 <functional>):

void Call(void (C::*am)()) {
    for (std::vector<C*>::size_type i = 0; i < pool.size(); i++) {
        (pool[i]->*am)();
    }
}

Call(&C::a);

然而,通常要做的事情(C++11 之前)是接受一个仿函数——也就是说,一个带有 operator() 的对象。 <functional>.

中内置了一些
template<class F>
void Call(F am) {
    for (std::vector<C*>::size_type i = 0; i < pool.size(); i++) {
        am(pool[i]);
    }
}

Call(std::mem_fun(&C::a));

<algorithm> 中有一个实用方法可以使用仿函数精确地遍历迭代器范围。

template<class F>
void Call(F am) {
    std::for_each(pool.begin(), pool.end(), am);
}