開発の進行を大幅に容易にする方法で、C++のプリプロセッサを利用しようとしています。非常に単純な問題があります。通常のC++クラスを使用しながら、CAPIライブラリを使用しています。このライブラリはコールバック/イベントに基づいており、関数(メソッドではない)のみを提供できます。このため、イベントごとに静的関数と非静的関数を宣言するという繰り返しのパターンがあります。
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);
これら両方を1行で定義するマクロを作成したいと思います。それは私のヘッダーのサイズを少なくとも10分の1に減らすでしょう!これが私の最も近い試みです(しかし十分にはほど遠いです):
#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__);
このようにこのマクロを使うとDECL_EVENT(ClickLeft, Vector, Vector vec)
。これが出力になります:
public: static inline Vector SEventClickLeft(Vector vec) { return globalClass->EventClickLeft(Vector vec); }
private: Vector EventClickLeft(Vector vec);
あなたははっきりと問題を見ることができます。静的関数はメソッドを呼び出し、引数の型と名前を提供します。タイプが指定されているため、コンパイラエラーが発生します。include/plugin.h:95:2: error: expected primary-expression before ‘TOKEN’ token
。
では、どうすればこれを解決できますか?何らかの解決策が必要であり、マクロの専門家が助けを提供できると確信しています。