Можно ли имитировать интерфейс Go в C / C ++? - PullRequest
6 голосов
/ 23 января 2012

В Go, если у типа есть все методы, определенные интерфейсом, он может быть присвоен этой интерфейсной переменной без явного наследования от нее.

Возможно ли подражать этой функции в C / C ++?

Ответы [ 4 ]

3 голосов
/ 24 января 2012

Да, конечно.

На самом деле код, который обрабатывает интерфейсы во время выполнения, написан на C. http://code.google.com/p/go/source/browse/src/pkg/runtime/iface.c

3 голосов
/ 02 февраля 2012

Да. Вы можете использовать чистый абстрактный класс и использовать шаблонный класс для переноса типов, «реализующих» абстрактный класс, чтобы они расширяли абстрактный класс. Вот простой пример:

#include <iostream>

// Interface type used in function signatures.
class Iface {
public:
        virtual int method() const = 0;
};

// Template wrapper for types implementing Iface
template <typename T>
class IfaceT: public Iface {
public:
        explicit IfaceT(T const t):_t(t) {}
        virtual int method() const { return _t.method(); }

private:
        T const _t;
};

// Type implementing Iface
class Impl {
public:
        Impl(int x): _x(x) {}
        int method() const { return _x; }

private:
        int _x;
};


// Method accepting Iface parameter
void printIface(Iface const &i) {
        std::cout << i.method() << std::endl;
}

int main() {
        printIface(IfaceT<Impl>(5));
}
0 голосов
/ 21 октября 2017

Я сделал удар для C ++. Я закончил тем, что работает, но это макро-цирк: https://github.com/wkaras/c-plus-plus-misc/tree/master/IFACE. Интерфейс - это два указателя, один для объекта-члена данных, а другой - для эквивалента виртуальной таблицы (структура указателей на функции thunk, которые вызывают функции-члены). Эти таблицы (к сожалению) создаются во время выполнения. Преобразование из интерфейса в подчиненный интерфейс требует поиска unordered_map, так что в среднем это O (1) сложность по времени. По сравнению с преобразованием указателя / ссылки производного класса в базовый класс, который является O (1) наихудшим случаем.

Это не очень удобно, но показывает, что интерфейсы могут быть (чисто) добавлены в C ++ с относительно небольшими усилиями. Есть случаи, когда интерфейсы лучше, чем ОО на основе наследования, и корова старается изо всех сил стараться поддерживать C ++ маленьким.

0 голосов
/ 23 января 2012

Я полагаю, что с GObject .

возможна некоторая грубая эквивалентность
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...