首页 > 解决方案 > 将函数调用转发到成员变量

问题描述

我正在尝试创建遵循模式的类,但试图避免使用继承来解决问题。但是有一些通用代码可以拉到它自己的类中,可以重用。像这样:

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(); } 

标签: c++c++17

解决方案


您尝试实现的通常称为 mixin。请参阅什么是 mixin,它们为什么有用?.

在 C++ 中,您通常可以执行以下操作:

  • 继承(没有动态调度)
  • CRTP

请参阅C++ 中的两种不同的混合模式。(混合?CRTP?)

还有其他不那么迷人的解决方案:

  • 制作common成员变量public或等效项(需要更改用户)
  • 一个宏、一个#include或任何类型的代码生成,可扩展为您需要的任何接口

推荐阅读