2016-09-10 2 views
2

У меня есть указатель на функцию с типом double(*)(void), и я хочу передать его функции с заданным параметром числа.Как отбрасывать из double (*) (void) в указатель функции с заданным числом параметров?

// already have function my_func with type double(*)(void) 
int para_num; 
para_num = get_fun_para_num(); // para_num can be 1 or 2 

if para_num == 1 
    cout << static_cast<double (*)(double)>(my_func)(5.0) << endl; 
else 
    cout << static_cast<double (*)(double, double)>(my_func)(5.0, 3.1) << endl; 

Я могу обеспечить, чтобы литой была правильной, - это любой способ сделать бросок без if-else?

+1

Короткий ответ: нет. –

+0

Ответ будет таким же для типа BTW. –

+0

Могу я предложить «переключатель»? –

ответ

0

Помещение, которое является очень небезопасным способом игры с указателями, , вы можете сделать это с помощью reinterpret_cast.

Это полный пример:

#include <iostream> 

/// A "generic" function pointer. 
typedef void* (*PF_Generic)(void*); 

/// Function pointer double(*)(double,double). 
typedef double (*PF_2Arg)(double, double); 

/// A simple function 
double sum_double(double d1, double d2) { return d1 + d2; } 

/// Return a pointer to simple function in generic form 
PF_Generic get_ptr_function() { 
    return reinterpret_cast<PF_Generic>(sum_double); 
} 

int main(int argc, char *argv[]) { 
    // Get pointer to function in the "generic form" 
    PF_Generic p = get_ptr_function(); 

    // Cast the generic pointer into the right form 
    PF_2Arg p_casted = reinterpret_cast<PF_2Arg>(p); 

    // Use the pointer 
    std::cout << (*p_casted)(12.0, 18.0) << '\n'; 

    return 0; 
}