2013-10-24 2 views
0

Я не уверен, возможно ли следующее. Может ли кто-то дать эквивалент для этого требования?Можно ли приравнять имя функции к другому имени функции?

if(dimension==2) 
    function = function2D(); 
else if(dimension==3) 
    function = function3D(); 

for(....) { 
    function(); 
} 
+1

C или C++? То, что вам нужно, это указатель на функцию – P0W

+2

«Я знаю, что следующее невозможно». - это. –

+1

@ H2CO3: Прохладный. Я этого не знал! Спасибо, что сообщили ... :) –

ответ

5

Это возможно, если предположить две вещи:

  1. Оба function2D() и function3D() имеют ту же сигнатуру и тип возвращаемого значения.
  2. function - это указатель на функцию с тем же возвращаемым типом и параметрами, что и function2D, и function3D.

Техника, которую вы изучаете, очень похожа на ту, которая используется при построении jump table. У вас есть указатель на функцию, который вы назначаете (и вызываете) во время выполнения на основе условий выполнения.

Вот пример:

int function2D() 
{ 
    // ... 
} 

int function3D() 
{ 
    // ... 
} 

int main() 
{ 
    int (*function)(); // Declaration of a pointer named 'function', which is a function pointer. The pointer points to a function returning an 'int' and takes no parameters. 

    // ... 
    if(dimension==2) 
    function = function2D; // note no parens here. We want the address of the function -- not to call the function 
    else if(dimension==3) 
    function = function3D; 

    for (...) 
    { 
    function(); 
    } 
} 
+0

Большая ссылка для ссылки на таблицу прыжков. Блестящее объяснение. –

+1

@ H2CO3: Спасибо. Слишком плохо, я закрыт. –

4

Вы можете использовать указатели функций.

Там в tutorial here, но в основном то, что вы делаете, это объявить его как это:

void (*foo)(int); 

где функция имеет один целочисленный аргумент.

Тогда вы называете это так:

void my_int_func(int x) 
{ 
    printf("%d\n", x); 
} 


int main() 
{ 
    void (*foo)(int); 
    foo = &my_int_func; 

    /* call my_int_func (note that you do not need to write (*foo)(2)) */ 
    foo(2); 
    /* but if you want to, you may */ 
    (*foo)(2); 

    return 0; 
} 

Так до тех пор, пока ваши функции имеют один и тот же номер и тип аргумента вы должны быть в состоянии делать то, что вы хотите.

2

Поскольку это также помечено C++, вы можете использовать std::function, если у вас есть доступ к C++11 или std::tr1::function если ваш компилятор поддерживает C++ 98/03 и TR1.

int function2d(); 
int function3D(); 

int main() { 
    std::function<int (void)> f; // replace this with the signature you require. 
    if (dimension == 2) 
     f = function2D; 
    else if (dimension == 3) 
     f = function3D; 
    int result = f(); // Call the function. 
} 

Как уже упоминалось в других ответах, убедитесь, что ваши функции имеют одинаковую подпись, и все будет хорошо.

Если ваш компилятор не предлагает std::function или std::tr1::function, всегда есть boost library.

1

Поскольку вы выбрали C++

Вот с std::function, например, в C++ 11

#include <functional> 
#include <iostream> 

int function2D(void) 
{ 
    // ... 
} 

int function3D(void) 
{ 
    // ... 
} 

int main() 
{ 

    std::function<int(void)> fun = function2D; 

    fun(); 

} 
+1

Да, 'std :: function', вероятно, правильно использовать в C++. –

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