2017-05-19 36 views
0

我需要在存储为类本身的静态成员的向量的每个元素上调用成员函数。如何将通用方法传递给静态函数

要做到这一点与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; 
+0

您的问题缺少一些东西。这将是一个实际的具体问题。 –

+1

偏离主题:而不是将大小转换为“int”并冒着循环中的溢出风险,请使用更合适的索引类型。 'size_t'应该为你做。 – user4581301

+0

如果你总是想调用类C的成员函数,那么指向成员函数的指针就可以工作。 – Phil1970

回答

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); 
} 
+0

我的错误是不加括号表示最后的表达,谢谢 – freesoft

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这个

相关问题