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

时间:2017-05-19 00:11:47

标签: c++ std

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

用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;

2 个答案:

答案 0 :(得分:1)

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

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

Call(&C::a);

然而,通常要做的事情(pre-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);
}

答案 1 :(得分:0)

我做了几周前你想做的事情。在绑定成员函数时,我要使用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用于此