如何将泛型方法传递给静态函数
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);
}
我需要对作为静态成员存储在 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);
}