2016-07-08 3 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

Что это значит? Вы спрашиваете, можете ли вы вызвать функцию сама по себе (это называется рекурсивной функцией, и вы можете), или вы спрашиваете, можно ли вызывать другую функцию несколько раз (если это так, используйте цикл for)? Редактировать: только что увидел ваш комментарий, я не спустил вниз, но я бы предположил, что кто-то подумал, что это неясно, вероятно, –

+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

Смежные вопросы