将函数调用转发到成员变量

时间:2019-02-09 21:50:55

标签: c++ c++17

我试图使类遵循某种模式,但是试图避免使用继承来解决问题。但是,可以将一些通用代码放入其自己的类中,以供重用。像这样:

class Common {
    public:
        int foo() {return 1;}
};

class A {
    public:
        // Expose Common's public methods
        int bar() {return 2;}
    private:
        Common common;
};

class B {
    public:
        // Expose Common's public methods
        int bar() {return 3;}
    private:
        Common common;
};

template<class... Ts> struct overloaded : Ts... { using Ts::operator()...; };
template<class... Ts> overloaded(Ts...) -> overloaded<Ts...>;

std::variant<A, B> variant = A{};
std::visit(overloaded {
        [](A a) { a.foo(); },
        [](B b) { b.foo(); },
}, variant);

无需编写此biolerplate代码,有没有办法实现我想要的?

int A::foo() { return common.foo(); } 
int B::foo() { return common.foo(); } 

1 个答案:

答案 0 :(得分:0)

您试图实现的通常称为混合。参见What is a mixin, and why are they useful?

在C ++中,您通常会这样做:

  • 继承(无动态调度)
  • CRTP

请参见Two different mixin patterns in C++. (mixin? CRTP?)

还有其他一些不太吸引人的解决方案:

  • 制作common成员变量public或等效变量(需要更改用户)
  • 宏,#include或可扩展到所需接口的任何形式的代码生成