我想做这样的事情:
struct CLI_Command{
CLI_Command(char* s, void (*h)(void)){
command_string = s;
handler = h;
}
char* command_string;
void (*handler)(void);
};
class CLI {
public:
CLI();
private:
CLI_Command cli_table[NO_CLI_COMMANDS] = {
CLI_Command("Command1", handler1),
CLI_Command("Command2", handler2)
};
void handler1(){};
void handler2(){};
};
我知道我需要类似于CLI :: *处理程序的东西,但我无法正确理解语法。我一直遇到这样的错误:
"error: no matching function for call to 'CLI_Command::CLI_Command(const char [4], <unresolved overloaded function type>)"
答案 0 :(得分:3)
这说明了正确的语法:
class CLI;
struct CLI_Command
{
CLI_Command(char* s, void (CLI::*h)(void))
{
command_string = s;
handler = h;
}
char* command_string;
void (CLI::*handler)(void);
void raise( CLI* the_cli ) { return (the_cli->*handler)(); }
};
class CLI
{
public:
CLI();
private:
static CLI_Command cli_table[NO_CLI_COMMANDS];
void handler1(){};
void handler2(){};
};
CLI::CLI_Command cli_table[NO_CLI_COMMANDS] = {
{ "Command1", &CLI::handler1 },
{ "Command2", &CLI::handler2 }
};
成员函数的名称不会衰减为指向成员的指针。在创建指向成员的指针时,必须明确使用&
和限定名称。
答案 1 :(得分:2)
除了其他答案,另一个选项是std::function
与std::bind()
一起使用:
struct CLI_Command{
...
std::function<void> handler;
};
class CLI {
...
CLI_Command cli_table[NO_CLI_COMMANDS] = {
{ "Command1", std::bind(&CLI::handler1, this) },
{ "Command2", std::bind(&CLI::handler2, this) }
};
void handler1(){};
void handler2(){};
};
答案 2 :(得分:1)
void handler1(){}
void handler2(){}
是CLI
的成员函数。 “解决”这些问题的正确方法是&CLI::handler1
而不是handler1
。但是,void (*h)(void)
不会接受这些内容,而void (CLI::*h)(void)
需要将其更改为handler1/handler2
。但这可能不是你想要的。
也许可以考虑阅读std::function
类型擦除,或者让{{1}}静态。
答案 3 :(得分:1)
您应该使用指向类成员的指针的语法,而不是松散函数指针的语法。
class CLI;
struct CLI_Command{
CLI_Command(char* s, void (CLI::*h)(void)){
command_string = s;
handler = h;
}
char* command_string;
void (CLI::*handler)(void);
};
此外,请确保通过当前CLI类的指针调用该函数;
void CLI::process(char *cmd) {
CLI_Command command* = /* lookup the command */
this->(command->handle)();
}
答案 4 :(得分:0)
要使其正常运行,请制作方法static
static void handler1(){};
static void handler2(){};
无论后果如何(read here请更详细信息)这将有:-(。