私は、各関数の内容が大きなマクロで作成されるインターフェイスを持っています。プログラマーが新しい関数を追加していて、その関数をインターフェースクラスに追加することを忘れた場合、実際のエラーから逸脱する多くのコンパイルエラーが作成されます。コンパイル時に、関数が特定のクラスのメンバであることをアサートする方法
この特定のマクロを使用する関数が特定のクラスのメンバであることをコンパイル時にアサートすることは可能でしょうか? C++ 03またはBoost機能を利用できます。
#define MACRO_OF_THE_DOOM(...) assertion_here(); do_something();
class A {
void functionA();
void functionB();
};
// This is valid usage
void A::functionA() {
MACRO_OF_THE_DOOM(1, 2, 3, 4, 5);
}
// This should give an understandable compile error, which tells
// definition should be A::functionB()
void functionB() {
MACRO_OF_THE_DOOM(6, 7, 8);
}
つまり、*実際に*する理由は、それらを実装する際にあなたの関数に 'A ::'の接頭辞を付けることを忘れてしまうことです。 '-Wall'を試しましたか? –
@BartekBanachewicz私は静的なアサートがコンパイラの警告の前に表示されるので、この場合は '-Wall'よりも優れていると思います。理論的に静的なアサーションを行うことが可能かどうかにも興味があります。 –
@BartekBanachewiczさらに、私が使用しているコンパイラには、この種の問題に対する警告がないようです。 –