2016-09-28 6 views
-2

ネットでしばらく検索していましたが、残念なことに私の答えに答えが見つかりませんでした。問題解決のための解決策が見つかりませんでした。 :関数の引数としてC++マクロのトークンペースト

1)function1a(some_args)

2)function2b(some_args)

は、私は何をしたい事があるだけであること、このパラメータはすべきで、正しいパラメータでfeededたときにこれらの機能を認識することができ、マクロを書くことですC/C++関数のパラメータでもありますが、これまでに私が行ったことがあります。

#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN() 

void function1a() 
{ 

} 
void function2a() 
{ 
} 

void anotherParentFunction(const char* type) 
{ 
    FUNCTION_RECOGNIZER(type); 
} 

明確に、マクロがある場合、私は聞いてるのよ、「functiontype」を認識し、anotherParentFunctionの引数を無視している/貼り付けのこの方法を実行するためにトリックか何かを存在します。

は、事前にあなたに感謝:)

+0

マクロの代わりに、関数のオーバーロードを使用する必要があります。 function1aとfunction1bに同じ名前をつけてください:function1。 –

+0

私はオーバーロードを避け、それを使わないで解決策を見つけたいと思っています。 – Gotenks00

+0

このタスクでは、オーバーロードは自然な方法であり、使用する必要があります。マクロはそのためのものではなく、マクロは型について知らないので使用できません。 –

答えて

0

をマクロを使用して主張する場合:anotherParentFunction()関数をスキップし、直接の代わりにマクロを使用しています。定数文字列で呼び出すと、つまり

FUNCTION_RECOGNIZER("1a"); 

となります。例えば、enumを使用し、enum asパラメータと対応する関数を呼び出すswitchとを別のparentFunction()を実装することであろう。もちろん、新しい関数を追加するたびにenumとswitch文を変更する必要がありますが、関数の名前を柔軟に選択できます。

似たようなものを実現するためのソリューションはほかにもたくさんありますが、実際には次のようなものがあります。ユースケースは何ですか?達成したいことは何ですか?

0

16.1.5では標準は言う:

実装が処理し、条件付きでソースファイルのセクションをスキップし、他のソースファイルを含めて、マクロを置き換えることができます。 これらの機能は、概念的には結果の翻訳単位の翻訳前に発生するため、前処理と呼ばれます。

[重点鉱山]もともと前処理は、別個のアプリケーションによって行われた

、それは本質的に独立した言語です。

今日、プリプロセッサはしばしばコンパイラの一部ですが、たとえば、Clang ASTツリーのマクロなどは表示されません。

これの重要な点は、プリプロセッサが型や関数、引数について何も知らないことです。

あなたの関数定義

void anotherParentFunction(const char* type) 

プリプロセッサに何を意味し、完全に無視されます。

FUNCTION_RECOGNIZER(type); 

これが定義されたマクロとして認識、しかしtype認識プリプロセッサシンボルではないそれはリテラルとして扱われるので、プリプロセッサはC++パーサーを参照するかと相互作用しないことがASTですさ木。

#define FUNCTION_RECOGNIZER(TOKEN) function##TOKEN() 

引数、リテラルtypeTOKENとしてトークン化されています

それはマクロ定義を参照します。 functionという単語はリテラルとして解釈され、結果の文字列にコピーされます。##は、TOKENというトークンの値をそのまま返します。結果の文字列にはfunctiontypeのトークンがコピーされます。 TOKENはマクロとして認識されないため、()はトークンを終了し、()はリテラルとして結果文字列に追加されます。

functiontype(); 

したがって、プリプロセッサの代替

FUNCTION_RECOGNIZER(type); 

だから、悪いニュースは、何あなたがやろうとして何をする方法はありませんが、これであってもよいですXY Problemと、おそらくあなたが達成しようとしていたものに対する解決策があります。

たとえば、引数の型に基づいて関数をオーバーロードすることも、パラメータに基づいてテンプレート関数を特殊化することも、パラメータ値に基づいてルックアップテーブルを作成することもできます。

関連する問題