を実装するC++インタフェースをミックスインを指示します。私の理解では、これはミックスインのためのものです。はどのようにインターフェースし、それを実装したクラスを持っていることが
など。 foo()は、ある条件でパラメータ値を変更する必要があります。ここで私はそれを行う方法です。
template <typename T>
class Mixin : public T
{
public:
virtual void foo(Enum & a) {
T::foo(a);
if (a == X){
a = Y;
}
}
};
問題は、私はこのようなインタフェースクラスまたはそれらのtypedef定義された識別子にスコープ接頭辞を書くいずれかの場合を除き、それはコンパイルされません、次のとおりです。
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;
}
}
};
にですインタフェースの定義から生じるタイプがほとんどない場合、大きな問題ではありません。しかし、多くの場合、それは醜くなることができます。ミックスインがInterfaceAオブジェクトを設計しているという事実をコードに反映させたいと思います。残念なことにInterfaceAのMixinを継承することは、私が避けるほうがいい「恐ろしいダイヤモンド」を導入する。それは可能ですか?
static_assertは素晴らしいですが、C++ 11以前の環境ではどのようなことをお勧めしますか? – peti
@peti:[how-to-do-static-assert-with-macros](http://stackoverflow.com/questions/14621968/how-to-do-static-assert-with-macros)をご覧ください。 – Jarod42