我试图使类遵循某种模式,但是试图避免使用继承来解决问题。但是,可以将一些通用代码放入其自己的类中,以供重用。像这样:
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(); }
答案 0 :(得分:0)
您试图实现的通常称为混合。参见What is a mixin, and why are they useful?。
在C ++中,您通常会这样做:
请参见Two different mixin patterns in C++. (mixin? CRTP?)
还有其他一些不太吸引人的解决方案:
common
成员变量public
或等效变量(需要更改用户)#include
或可扩展到所需接口的任何形式的代码生成