2013-06-16 10 views
5

Chciałbym utworzyć mapę z kluczami będącymi nazwą funkcji jako ciągiem znaków i wartością będącą samą funkcją. Tak coś takiego ...C++ map funkcji 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; 
} 

będzie użyty do wywołania funkcji sqrt na pewnej wartości wejściowej. Oczywiście możesz dodać do mapy inne funkcje, takie jak sin, cos, tan, acos itp., I po prostu wywołać je za pomocą jakiegoś ciągu znaków. Mój problem polega na tym, aby to, co typ wartość powinna być na mapie, oba wskaźniki funkcyjne i std :: funkcja daje następujący błąd na linii std :: make_pair

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

Więc co powinno być w moim typie wartość dla zbudowany w funkcjach takich jak std :: sqrt?

Dzięki

+0

Są przeciążone. W jaki sposób można określić, którego użyć? – chris

+0

Na pewno mogę określić, że podpis powinien być w jakiś sposób podwójny (podwójny)? Nawet wykonanie std :: make_pair daje ten sam błąd. Rozumiem, że chodziło o 4 różne typy, od http://www.cplusplus.com/reference/cmath/sqrt/? –

+0

Możesz rzucić tę funkcję. – chris

Odpowiedz

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

Tak, działało idealnie, więc domyślam się, że problem polegał tylko na przeciążeniu funkcji matematycznych, a obsada statyczna się tym zajmuje. –

0

Można używać typedef dla wskaźnika funkcji i od jego mapę można użyć operatora [], aby wstawić funkcję:

typedef double(*mathFunc)(double); 

... 

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

... 

kod na ideone

Potrzebne będą inne mapy funkcji, które nie przyjmują pojedynczego parametru double jako parametrów.

Powiązane problemy