2013-06-16 2 views
5

Vorrei creare una mappa con i tasti che sono un nome di funzione come una stringa e il valore è la funzione stessa. Quindi qualcosa del genere ...Mappa C++ delle funzioni di cmath

#include <cmath> 
#include <functional> 
#include <map> 
#include <string> 

typedef std::function<double(double)> mathFunc; 

int main() { 
    std::map< std::string, mathFunc > funcMap; 

    funcMap.insert(std::make_pair("sqrt", std::sqrt)); 

    double sqrt2 = (funcMap.at("sqrt"))(2.0); 

    return 0; 
} 

verrebbe utilizzato per chiamare la funzione sqrt su qualche valore di input. Quindi, naturalmente, è possibile aggiungere altre funzioni alla mappa come sin, cos, tan, acos, ecc. E basta chiamarle con qualche stringa di input. Il mio problema è quello di ciò che il tipo di valore dovrebbe essere nella mappa, entrambi i puntatori a funzione e std :: funzione di dare il seguente errore sulla linea di std :: make_pair

error: no matching function for call to 'make_pair(const char [5], <unresolved overloaded function type>)' 

Così che cosa dovrebbe essere il mio tipo di valore per essere costruito in funzioni come std :: sqrt?

Grazie

+0

Sono sovraccarichi. Come può sapere quale usare? – chris

+0

Sicuramente posso specificare che la firma dovrebbe essere doppia (doppia) in qualche modo? Anche fare std :: make_pair dà lo stesso errore. Immagino tu intenda come ci siano 4 tipi diversi, come da http://www.cplusplus.com/reference/cmath/sqrt/? –

+0

È possibile trasmettere la funzione. – chris

risposta

4
typedef double (*DoubleFuncPtr)(double); 
... 
funcMap.insert(std::make_pair("sqrt", static_cast<DoubleFuncPtr>(std::sqrt))); 
+0

Sì, questo ha funzionato perfettamente, quindi credo che il problema fosse solo con le funzioni matematiche sovraccariche e il cast statico si occupasse di ciò. –

0

È possibile utilizzare un typedef per un puntatore a funzione e sin dalla sua una mappa è possibile utilizzare operatore [] per inserire la funzione:

typedef double(*mathFunc)(double); 

... 

funcMap[std::string("sqrt")]= std::sqrt; 

... 

Codice e ideone

Avrete bisogno di altre mappe per funzioni che non richiedono un singolo double come parametri.