c++ - 将函数调用转发到成员变量
问题描述
我正在尝试创建遵循模式的类,但试图避免使用继承来解决问题。但是有一些通用代码可以拉到它自己的类中,可以重用。像这样:
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(); }
解决方案
您尝试实现的通常称为 mixin。请参阅什么是 mixin,它们为什么有用?.
在 C++ 中,您通常可以执行以下操作:
- 继承(没有动态调度)
- CRTP
还有其他不那么迷人的解决方案:
- 制作
common
成员变量public
或等效项(需要更改用户) - 一个宏、一个
#include
或任何类型的代码生成,可扩展为您需要的任何接口
推荐阅读
- php - 如何编写 Laravel GroupBy 查询?
- python - error with module multiprocessing under python3.8
- html - I used overlapping on image but the second image didn't show on the RWD(just the first pic have it)
- java - Android JNI 错误:NoSuchMethodError:没有非静态方法
- jenkins - 尝试更新一些旧 Jenkins 作业的配置时出现 ERR_CONNECTION_RESET 错误
- spring-boot - Spring Boot soap client auto retry
- ionic-framework - how to use *ngIf in in displaying input that has id
- php - mysqli_fetch_assoc not working with mysqli_stmt_store_result
- mysql - Find viewers who have viewed all movies of all types
- python - Django: Choose from related set in db query