Переадресация вызовов функций в переменную-член - PullRequest
0 голосов
/ 10 февраля 2019

Я пытаюсь создать классы, которые следуют шаблону, но пытаюсь избежать использования наследования для решения проблемы.Но есть некоторый общий код, который можно вставить в его собственный класс, который можно использовать повторно.Как это:

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

Есть ли способ достичь того, чего я хочу, без написания этого кода биологической карты?

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

1 Ответ

0 голосов
/ 10 февраля 2019

То, что вы пытаетесь реализовать, обычно называется миксином.См. Что такое миксин и почему они полезны? .

В C ++ вы обычно либо делаете:

  • Наследование (без динамической диспетчеризации)
  • CRTP

См. Два разных миксиновых паттерна в C ++.(mixin? CRTP?)

Существуют и другие менее гламурные решения:

  • Создание common переменной-члена public или эквивалентной (требует изменений для пользователей)
  • Макрос, #include или любой вид генерации кода, который расширяется до любого интерфейса, который вам необходим
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...