Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何通过C++;_C++_Map_Function Pointers - Fatal编程技术网

C++ 如何通过C++;

C++ 如何通过C++;,c++,map,function-pointers,C++,Map,Function Pointers,让我们假设mf_ptr是类的成员函数指针的typedef。我们有流动的代码: map<string, mb_ptr> cmd_table; cmd_table["exit"] = &class_name::exit; string cmd; while (cin >> cmd){ (this->*cmd_table[cmd])(); } map cmd_表; cmd_table[“exit”]=&class_name::exit; 字符串cmd;

让我们假设mf_ptr是类的成员函数指针的typedef。我们有流动的代码:

map<string, mb_ptr> cmd_table;
cmd_table["exit"] = &class_name::exit;
string cmd;
while (cin >> cmd){
    (this->*cmd_table[cmd])();
}
map cmd_表;
cmd_table[“exit”]=&class_name::exit;
字符串cmd;
while(cin>>cmd){
(此->*cmd_表[cmd])();
}

那么我应该如何定义函数exit()来退出while循环呢?

您有几个选项:

  • 在exit函数中引发异常,并在while循环中捕获它

  • 让所有函数返回一个布尔值,无论是否退出while循环


  • 您有几个选择:

  • 在exit函数中引发异常,并在while循环中捕获它

  • 让所有函数返回一个布尔值,无论是否退出while循环


  • 您可以这样做:

    while (cin >> cmd && !class_name::exitLoop){
        (this->*cmd_table[cmd])();
    }
    
    其中
    class\u name::exitLoop
    将由
    class\u name::exit()
    设置为true

    我个人认为:

    while(cin >> cmd && cmd != "exit") {
        (this->*cmd_table[cmd])();
    }
    

    您可以这样做:

    while (cin >> cmd && !class_name::exitLoop){
        (this->*cmd_table[cmd])();
    }
    
    其中
    class\u name::exitLoop
    将由
    class\u name::exit()
    设置为true

    我个人认为:

    while(cin >> cmd && cmd != "exit") {
        (this->*cmd_table[cmd])();
    }
    
    您可以使用(如上指定的方式):

    在这种情况下,循环将在处理
    exit
    命令后终止(下一轮
    >
    迭代将失败)

    如果您想获得更大的复杂性,可以创建一个自定义流提取操作符

    我看到的优点是,你可以简单地写:

    while (cin >> cmd);
    
    您还可以处理错误/未知命令(例如,如果键不存在元素,则
    std::map::operator[]
    将添加到映射中-这可能不是您想要的)。
    但是创建
    CmdExecutor
    类还需要一些胶水(从嵌入的“master”类传入
    表[]
    引用的构造函数或模板,…)。对于一个简单的例子,过度杀戮

    编辑:还应添加关闭
    cin
    (这是
    eof
    位的有效设置)可能也是不需要的。
    fail
    位(之后可以再次清除)可能是一个更好的选择。

    您可以使用(按照上面指定的方式):

    在这种情况下,循环将在处理
    exit
    命令后终止(下一轮
    >
    迭代将失败)

    如果您想获得更大的复杂性,可以创建一个自定义流提取操作符

    我看到的优点是,你可以简单地写:

    while (cin >> cmd);
    
    您还可以处理错误/未知命令(例如,如果键不存在元素,则
    std::map::operator[]
    将添加到映射中-这可能不是您想要的)。
    但是创建
    CmdExecutor
    类还需要一些胶水(从嵌入的“master”类传入
    表[]
    引用的构造函数或模板,…)。对于一个简单的例子,过度杀戮



    编辑:还应添加关闭
    cin
    (这是
    eof
    位的有效设置)可能也是不需要的。
    fail
    位(之后可以再次清除)可能是一个更好的选择。

    您真的想为函数选择其他名称--
    exit
    是标准库的一部分。这不是对ure问题的回答,所以我要做一个注释:我个人会选择:while(cin>>cmd&&cmd!=“exit”){(此->*cmd_表[cmd])();}@JerryCoffin exit是这里的一个成员函数,我认为我们不需要其他名称。@NadirMuzaffar也许你给出了最好的答案,虽然它不是我问题的答案。非常感谢!你真的想为函数选择其他名称--
    exit
    是标准库的一部分。这不是对你问题的回答,所以我很抱歉给它一个评论:我个人会使用:while(cin>>cmd&&cmd!=“exit”){(这个->*cmd_表[cmd])()}@JerryCoffin exit是这里的一个成员函数,我认为我们不需要另一个名称。@NadirMuzaffar也许你给出了最好的答案,认为这不是我问题的答案。非常感谢!另一个选项是传入一个指向布尔值的指针,让函数在exit时设置它。这太糟糕了,但有时这就是答案。非常感谢h!另一个注意事项-只需创建一个
    boolcmd\u调度程序(istream&cmd\u in)
    并调用
    while(cmd\u调度程序(cin))
    …另一个选项是传入一个指向布尔值的指针,让函数在退出时设置它。这太糟糕了,但有时这就是答案。非常感谢!另一个注意事项是-只需创建一个
    bool cmd_调度程序(istream&cmd_in)
    并调用
    while(cmd_dispatcher(cin));
    …我投赞成票,因为你的答案很有帮助。但是..你的第一种方法可能在这里获得最好的效率,但是exit()只在while循环的条件为cin>>cmd时有效,这并不明显。在你的第二种方法中,“>>”操作符完成了我们预期>>不会完成的工作,这是危险的。而(cin>>cmd)迈克:我实际上同意你所做的所有观点。个人认为,流插入/提取算子是C++的一种癌症(“…………代码> <代码> > >我们不期望代码< > >代码>做……”。我承认,我只是把这看作是“你能做到多紧凑”的挑战之一。我投赞成票,因为你的答案很有帮助。但是..你的第一种方法可能在这里获得最好的效率,但是exit()只在while循环的条件为cin>>cmd时有效,这并不明显。在第二种方法中,“>>”操作符完成了我们预期>>无法完成的工作,这很危险。和while(cin>>cmd);迈克:我真的同意你说的所有观点。我个人认为流插入/提取算子是C++的一个癌症(“…………代码> > /代码>我们的工作是什么?