Мои объявления интерфейса обычно (всегда?) Следуют той же схеме. Вот пример:
class Output
{
public:
virtual ~Output() { }
virtual void write( const std::vector<char> &data ) = 0;
protected:
Output() { }
private:
Output( const Output &rhs ); // intentionally not implemented
void operator=( const Output &other ); // intentionally not implemented
};
Шаблон всегда один и тот же: публичный виртуальный деструктор, несколько чистых виртуальных методов, которые составляют реальный интерфейс. защищенный ctor по умолчанию, отключенная конструкция копирования и назначение копирования. Я начал использовать два маленьких вспомогательных макроса, которые можно использовать для упрощения вышеупомянутого до
ABSTRACT_BASECLASS_BEGIN(Output)
virtual void write( const std::vector<char> &data ) = 0;
ABSTRACT_BASECLASS_END(Output)
К сожалению, я не нашел хорошего способа сделать это с помощью всего одного макроса. Еще лучше, я бы хотел полностью избегать макросов. Однако, единственное, что мне пришло в голову, это генератор кода, который для меня немного излишним.
Какой самый простой способ объявить интерфейс в C ++ - прямо на языке. Использование препроцессора приемлемо, но я бы хотел избежать внешних генераторов кода.