将成员函数与其类分开

时间:2019-08-28 17:28:05

标签: c++

如果有一堆类,它们都具有相同的成员函数:

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模板函数?

2 个答案:

答案 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的成员函数。编译器应将其报告为编译时错误。

我不清楚您为什么要这么做。