2013-05-17 30 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)