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

时间:2012-06-12 21:55:03

标签: c++

我有一个类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

2 个答案:

答案 0 :(得分:4)

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

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

答案 1 :(得分:0)

如果您只使用此处的功能,则根本不需要模板。

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

所以你可以写这样的东西

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