私はC++でプリプロセッサを利用して、開発の進展を大幅に緩和しようとしています!私はかなり単純な問題を抱えています。私はC APIライブラリを使用していますが、通常のC++クラスを使用しています。このライブラリはコールバック/イベントに基づいていますが、私は関数(メソッドではありません)にしか渡すことができません。私は1行でこれらの両方を定義するマクロを作成したいC++プリプロセッサをプッシュする
public: // Here is the static method which is required
static inline Vector StaticEventClickLeft(Vector vec) { return globalClass->EventClickLeft(vec); }
private: // And here is the method (i.e non-static)
Vector EventClickLeft(Vector vec);
:このため、私は、各イベントのために静的および非静的関数を宣言するの繰り返しパターンを持っています。それは私のヘッダーのサイズを少なくとも10倍減らすでしょう!私はこのDECL_EVENT(ClickLeft, Vector, Vector vec)
のように、このマクロを使用する場合は
#define DECL_EVENT(func, ret, ...) \
public: static inline ret S ## Event ## func(__VA_ARGS__) { return globalClass->Event ## func(__VA_ARGS__); } \
private: ret Event ## func(__VA_ARGS__);
:ここに私の最も近いの試み(しかし十分から)です。これは出力になります:
public: static inline Vector SEventClickLeft(Vector vec) { return globalClass->EventClickLeft(Vector vec); }
private: Vector EventClickLeft(Vector vec);
この問題ははっきりとわかります。 static関数はメソッドを呼び出し、引数の型と名前を指定します。型が指定されているため、コンパイラエラーが発生します。 include/plugin.h:95:2: error: expected primary-expression before ‘TOKEN’ token
。
どうすればこの問題を解決できますか?いくつかの解決策が必要であり、マクロの専門家が助けてくれると確信しています!
Boost.Preprocessorには、ペアの2番目のコンポーネントなどを投影するために必要なツールが含まれています。いくつかの例については、[この質問](http://stackoverflow.com/q/9897074/596781)を参照してください。 –
Cコールバックの宛先として静的メンバーを使用することは移植性がありません。Cからのコールバックは、** extern "C"と宣言されたC++関数を呼び出すだけでなければなりません。そうでなければ、あなたのプラットフォームで保持されているC関数と同じABIを持つC++静的メンバーメソッドに依存します。 –
@ LokiAstari私は、外部の "C"関数 'LoadPlugin'(最初の答えについての私のコメントを参照してください)にコールバックを設定するために静的なC関数を使用するので、心配はありません。 –