У меня есть интерфейс и класс, реализующий его:Как сказать C++ подмешать интерфейс он реализует
class InterfaceA
{
public:
enum Enum { X, Y, Z };
virtual void foo(Enum &) = 0;
virtual void bar() = 0;
};
class ClassA : public InterfaceA
{
public:
virtual void foo(Enum & a) {
a = X;
}
virtual void bar();
};
Мне нужно расширить функциональность реализующего класса InterfaceA в одном аспекте. По моему мнению, для этого нужны миксины.
E.g. foo() должен изменить значение параметра в каком-либо состоянии. Вот как я это делаю:
template <typename T>
class Mixin : public T
{
public:
virtual void foo(Enum & a) {
T::foo(a);
if (a == X){
a = Y;
}
}
};
Проблема заключается в том, что не будет компилироваться, если я или не писать области действия префиксов идентификаторы, определенные в классе интерфейса или определение типа во их следующим образом:
template <typename T>
class Mixin : public T
{
public:
typedef InterfaceA::Enum Enum;
virtual void foo(Enum & a) {
T::foo(a);
if (a == InterfaceA::X){
a = InterfaceA::Y;
}
}
};
Это не так уж много, если из определения интерфейса будет мало таких типов. Но если их много, это может стать уродливым. Я хотел бы, чтобы код отражал тот факт, что Mixin манипулирует объектом InterfaceA по дизайну. К сожалению, наследование Mixin от InterfaceA представляет «страшный бриллиант», которого я бы лучше избегал. Это возможно?
static_assert классный, но что бы вы предложили в среде pre-C++ 11? – peti
@peti: вы можете посмотреть на [how-to-do-static-assert-with-macros] (http://stackoverflow.com/questions/14621968/how-to-do-static-assert-with-macros) – Jarod42