定义接收指向其他类成员函数的指针的成员函数模板,添加应用函数

define member function template that receive pointer to other class member function add apply the function

本文关键字:函数 成员 函数模板 指针 添加 应用 其他 定义      更新时间:2023-10-16

我有一个类A,它有一个成员变量vector<B> 。 我想定义一个名为 DoToAll(funcPtr) 的函数模板,该模板将迭代所有向量并应用该函数。

class A 
{
vector<B> v;
template <?????>
void DoToAll(f);
loop on v and apply the member function f;
}
class B{
void f1();
void f2();
.
.
.
}

我怎么写DoToAll

你坚持认为参数必须是函数指针吗?否则,它可能只是

template <class F>
void DoToAll(F f) {
  std::for_each(v.begin(), v.end(), f);
}

这适用于每个f st。 f(x) ,其中 x 是向量的元素,是有效的。这意味着函数指针和函子(如 std::functionstd::bind)都可以。不幸的是,这不包括成员函数指针,因为您称它们为 x->*f() ,而不是 f() 。但这也可以通过将成员函数指针包装到可以正确转发调用的函子中来克服。该标准已经提供了这样的适配器,适合您的适配器是 mem_fun_ref_t .您可以添加采用函数指针的重载DoToAll

template <class This, class Ret>
void DoToAll(Ret (*This::f)()) {
  std::for_each(v.begin(), v.end(), std::mem_fun_ref(f));
}

如果此处仅使用函数,则根本不需要模板。

void DoToAll(void (*f)(B&)) { /*...*/ }

所以你可以写这样的东西

void Change(const B& what)
{
    what.ChangeSomething();
}
//...
a.DoToAll(Change) // or a.DoToAll(&Change)