2016-09-10 1 views
2

J'ai un pointeur de fonction avec le type double(*)(void) et je veux le transformer en fonction avec un paramètre de nombre donné.Comment passer de double (*) (vide) à un pointeur de fonction avec un nombre donné de paramètre?

// 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; 

Je peux vous assurer que le casting est correct, est une façon de faire le casting sans if-else?

+1

La réponse courte est: non. –

+0

la réponse serait la même pour un type BTW. –

+0

Puis-je offrir un 'switch'? –

Répondre

0

Prémisse qui est une façon très dangereuse de jouer avec des pointeurs, vous pouvez le faire avec reinterpret_cast.

Ceci est un exemple complet:

#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; 
}