2013-05-17 54 views
0

我想在muParser中定義一個新函數LinkFunctionWrapper -Class應該註冊。如何爲muParser創建函數指針

class FunctionWrapper 
{ 
public: 
virtual double Evaluate(const double*, int) = 0; 
}; 

DefineFun -Method需要一個字符串和一個函數指針。我怎樣才能使這個指針功能Evaluate

我想打電話給DefineFun在其他類......是這樣的:

bool OtherClass::RegisterFunction(std::string name, FunctionWrapper *wrapper) 
{ 
    fParser.DefineFun(name, wrapper->????); 
} 

THx的

+0

我得到這個錯誤:'呼叫爲「mu沒有匹配功能:: ParserCallback :: ParserCallback(double(FunctionWrapper :: *&)(const double *,int),bool&)'' – shinpei

回答

0

你有沒有考慮過的std ::功能的包裝?結合std :: bind或lambdas,它可能可以做你需要的一切。例如,

#include <unordered_map> 
#include <functional> 
#include <exception> 
#include <memory> 
#include <string> 
#include <iostream> 

class Evaluator 
{ 
public: 
    virtual ~Evaluator() {} 
    virtual double Evaluate(const double*, int) = 0; 
    // ... 
}; 

class Registry 
{ 
public: 
    typedef std::function<double(const double*, int)> Fn; // For easier reading 

    class NameNotFoundException : public std::exception {}; 

    void Register(const std::string& name, const Fn& fn) 
    { 
     _regMap[ name ] = fn; 
    } 

    void Call(const std::string& name, const double* const data, const int size) 
    { 
     auto it = _regMap.find(name); 
     if(it == _regMap.end()) 
     { 
      throw NameNotFoundException(); 
     } 

     it->second(data, size); // Call fn 
    } 

private: 
    std::unordered_map<std::string, Fn> _regMap; 
}; 

class EvaluatorImpl : public Evaluator 
{ 
public: 
    double Evaluate(const double* const data, const int size) 
    { /*...*/ 
     for(int n=0; n < size; ++n) 
      std::cout << data[n] << '\n'; 
     return 0;  
    } 
    // ... 
}; 

int main() 
{ 
    std::shared_ptr<Evaluator> eval(new EvaluatorImpl()); 

    Registry reg; 

    // Could use a lambda here instead of std::bind 
    reg.Register("Bob", 
     std::bind(&Evaluator::Evaluate, eval, std::placeholders::_1, std::placeholders::_2)); 

    const double data[] = { 1, 2, 3 }; 
    int size = 3; 

    reg.Call("Bob", data, size); 
} 
+0

我得到一個錯誤:'非法使用非靜態成員函數'double FunctionWrapper :: Evaluate(const double *,int) ''當我調用'std :: bind'時,muParser無法處理參數'std :: function' – shinpei

+0

好的,如果這個(更正後的)代碼不起作用,你能否提供你正在嘗試使用的特定muParser函數?如果你試圖使用成員函數指針,它可能需要是一個靜態成員,或者你需要提供一個實例來調用它。 – metal

+0

我戳着畝地。你需要提供更多的代碼。發佈一個完整的*但最小*的樣本來證明問題。 – metal

0

這裏的樣本代碼:

#include <functional> 
#include "muParser.h" 

class Evaluator 
{ 
public: 
    virtual ~Evaluator() {} 
    virtual double Evaluate(const double*, int) = 0; 
    // ... 

    typedef std::function<double(const double*, int)> Fn; // For easier reading 
}; 


class EvaluatorImpl : public Evaluator 
{ 
public: 
    double Evaluate(const double* const data, const int size) 
    { return 0; } 

}; 

void MyClass::test() 
{ 
    Evaluator *e = new EvaluatorImpl(); 
    Evaluator::Fn fn = std::bind(&Evaluator::Evaluate, e, std::placeholders::_1, std::placeholders::_2); 

    mu::Parser fParser; 
    fParser.DefineFun("test", fn); 
} 

我得到no matching function for call to mu::ParserCallback::ParserCallback(std::function<double(const double*, int)>&, bool&)’當我打電話DefineFun(string, T a_func)