我一直在尝试将方法作为指针函数传递,因此我创建了一个类似于here的绑定器但是由于方法已定义,我无法将其作为参数传递给绑定器。我需要传递方法指针的函数来自找到arduino的{Regex Lua Pattern库here。
void InterpreterClass::init()
{
MatchState ms("255.255.255.255");
bind_regex_member<InterpreterClass, &InterpreterClass::MatchAddressCallback, 0> b(this);
ms.GlobalMatch("(%d%d?%d?)", b);
}
void InterpreterClass::MatchAddressCallback(const char * match, const unsigned int length, const MatchState & ms)
{
//do something
}
在ms.GlobalMatch
第二个参数是我想在解释字符串后执行的方法,问题是函数需要遵守特定的参数序列,如果它是“委托”的。
typedef void (*GlobalMatchCallback) (const char * match, // matching string (not null-terminated)
const unsigned int length, // length of matching string
const MatchState & ms); // MatchState in use (to get captures)
我尝试使用声明的所有参数实现binder,并且声明了类型名称。 Bellow跟着活页夹:
template<class T, void(T::*PTR)(const char *, const unsigned int, const MatchState &), size_t I>
struct bind_regex_member
{
typedef void(*fn_type)(const char *, const unsigned int, const MatchState &);
explicit bind_regex_member(const T* _ptr)
{
ptr = _ptr;
}
static void func(const char * match, const unsigned int length, const MatchState & ms)
{
(ptr->*PTR)(match, length, ms);
}
operator fn_type()
{
return &func;
}
private:
static const T* ptr;
};
template<class T, void(T::*PTR)(const char *, const unsigned int, const MatchState &), size_t I>
const T* bind_regex_member<T, PTR, I>::ptr = NULL;
编译器显示的第一个错误是:
Error: `Interpreter.cpp:7:80: error: could not convert template argument ‘&InterpreterClass::MatchAddressCallback’ to ‘void (InterpreterClass::*)(const char*, unsigned int, const MatchState&)’`
制作GlobalMatchCallback
的活页夹也不起作用。我应该怎样对MatchAddressCallback
进行调用?
项目的最小代码回购:https://github.com/rsegecin/RegexArduino.git。
PS:我发现很难用这种类型的问题表达自己,所以欢迎任何反馈。答案 0 :(得分:4)
这里的问题是bind_regex_member中的ptr指向const T,而您的方法InterpreterClass :: MatchAddressCallback是非const。 基本上是这样的:
InterpreterClass i;
const InterpreterClass* myPtr = &i;
MatchState myMs;
myPtr->MatchAddressCallback("", 0, myMs); // OUCH! myPtr points to const T and MatchAddressCallback is non const member function
从bind_regex_member中的ptr中删除const,它应该可以工作!
编辑: Interpreter.h中存在第二个问题:
class Interpreter
{
public:
void init();
GlobalMatchCallback MatchAddressCallback; // <----------- HERE
};
您不能声明这样的方法。 “final”Interpreter.h应如下所示:
#ifndef _INTERPRETER_h
#define _INTERPRETER_h
#include <Arduino.h>
#include "Regexp.h"
template<class T, void(T::*PTR)(const char *, const unsigned int, const MatchState &), size_t I>
struct bind_regex_member
{
typedef void(*fn_type)(const char *, const unsigned int, const MatchState &);
explicit bind_regex_member(T* _ptr)
{
ptr = _ptr;
}
static void func(const char * match, const unsigned int length, const MatchState & ms)
{
(ptr->*PTR)(match, length, ms);
}
operator fn_type()
{
return &func;
}
private:
static T* ptr;
};
template<class T,
void(T::*PTR)(const char *, const unsigned int, const MatchState &), size_t I>
T* bind_regex_member<T, PTR, I>::ptr = NULL;
class InterpreterClass
{
public:
void init();
void MatchAddressCallback(const char * match, const unsigned int length, const MatchState & ms);
};
extern InterpreterClass Interpreter;
#endif