2016-07-08 7 views
0

関数名がでなく、同じ関数(別のパラメータを持つ)をと呼ぶ方法を探しています。このようなもの:名前を知らずに同じ機能を呼び出す?

void my_func(int x) 
{ 
    //... 
    SELF(x-5); 
    //... 
} 

私はいくつかの複雑なマクロがあるので、上記を使用する必要があります。私がこれを必要とする理由の例:

#define start_func if(id == 0) return SELF(); 

int A(int id) { start_func /*...*/ } 
int B(int id) { start_func /*...*/ } 
int C(int id) { start_func /*...*/ } 
int D(int id) { start_func /*...*/ } 
int E(int id) { start_func /*...*/ } 
int F(int id) { start_func /*...*/ } 

int A() { /*...*/ } 
int B() { /*...*/ } 
int C() { /*...*/ } 
int D() { /*...*/ } 
int E() { /*...*/ } 
int F() { /*...*/ } 
+1

私の質問がダウン投票された理由は分かりません。 – MATH000

+0

どういう意味ですか?あなたはそれ自身で関数を呼び出すことができるかどうかを尋ねています(これは再帰関数と呼ばれます)。あるいは、別の関数を複数回呼び出すことができるかどうか尋ねていますか?編集:ちょうどあなたのコメントを見た、私はdownvoteしなかったが、おそらく誰かがそれが不明であると思ったと思うだろう –

+0

この質問はばかげている。私はそれについて何も説明しておらず、あなたのコードの問題についても説明していません。 –

答えて

1

私はこの厄介なことを考え出しましたが、それは仕事の種類です。これは、異なるパラメータを使用して自身を呼び出すことはできますが、同じ名前(オーバーロード)の異なる関数ではありません。また、デフォルトパラメータもサポートしていません。

#define BEGIN_FUNC(ret, name, ...) ret name(__VA_ARGS__) { ret(*SELF)(__VA_ARGS__) = name; 
#define END_FUNC } 

BEGIN_FUNC(int, factorial, int n) 
    return n == 0 ? 1 : n * SELF(n - 1); 
END_FUNC 

int main() 
{ 
    factorial(5); 
} 
1

定義済みの変数__func__を使用すると、現在の関数の名前を取得できます。それは役に立ちますか?

+0

@HolyBlackCat編集のおかげで、私は '__func__'が実際にconstexpr変数であることを認識していませんでした。 gccのドキュメントによると、 '__func__'はC99では標準ですが、C++では標準ではないようです。コンパイラ固有の解決策はまだありますか? –

+0

これはC++の一部ですが、驚くべきことにそれは多かれ少なかれ新しいものです。これはC++ 11で追加されました。 – HolyBlackCat

関連する問題