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

标签 c++

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

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 是 vector 的一个元素,是有效的。这意味着 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));
}

关于c++ - 定义接收指向其他类成员函数的指针的成员函数模板添加应用函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11005459/

相关文章:

c++ - 我可以使用 = 运算符将一个对象的值分配给另一个对象,而不重载运算符吗?

c++ - () = 类中的运算符重载

c++ - 具有枚举规范的模板模板类在 MSVC++ 编译器 : C3201 上失败

C++ 语法 : Using a typedef to typecast

c++ - 如何限制文字运算符的范围

c++ - google-test 和 static constexpr 成员

c++ - 为什么我不能在指定值上使用++?

c++ - C++11 中带有虚拟成员的虚拟析构函数

c++ - 这是 "Idiom"定义良好吗?

Emacs 的 C++11 模式或设置?