如果有一堆类,它们都具有相同的成员函数:
struct A { void f(){} };
struct B { void f(){} };
struct C { void f(){} };
// ...and so on
我不想通过继承添加任何抽象,但是我仍然希望能够在所有给定对象上调用f()
。
int main()
{
A a; B b; C c;
call_all(&f, a, b, c);
}
问题是:如何将f
与其中定义的类上下文隔离,以便可以使用示例中的call_all
模板函数?
答案 0 :(得分:2)
名称f
并不通用,但是您可以这样做:
template <typename ... Ts>
void call_f(Ts& ... ts)
{
(ts.f(), ...);
}
然后
A a; B b; C c;
call_f(a, b, c); // a.f(), b.f(), c.f();
lambda更通用:
template <typename F, typename ... Ts>
void call_all(F&& f, Ts&& ... ts)
{
(f(std::forward<Ts>(ts)), ...);
}
然后
A a; B b; C c;
call_all([](auto& e){ e.f(); }, a, b, c); // a.f(), b.f(), c.f();
答案 1 :(得分:0)
是否可以从其类中拆分成员函数,以便可以在另一个类上调用同一函数?
不。当类不相关时,不能使用A
的实例调用B
的成员函数。编译器应将其报告为编译时错误。
我不清楚您为什么要这么做。