我有一个类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
?
答案 0 :(得分:4)
你是否坚持认为参数必须是函数指针?否则,它可能只是
template <class F>
void DoToAll(F f) {
std::for_each(v.begin(), v.end(), f);
}
适用于每个f
st。 f(x)
,其中x
是向量的元素,是有效的。这意味着函数指针和仿函数(例如std::function
和std::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)