当前位置:  开发笔记 > 编程语言 > 正文

C++中的简单文本菜单

如何解决《C++中的简单文本菜单》经验,为你挑选了1个好方法。

我正在用C++编写一个愚蠢的小应用程序来测试我的一个库.我希望应用程序向用户显示命令列表,允许用户键入命令,然后执行与该命令关联的操作.听起来很简单.在C#中,我最终会编写一个命令列表/映射,如下所示:

    class MenuItem
    {
        public MenuItem(string cmd, string desc, Action action)
        {
            Command = cmd;
            Description = desc;
            Action = action;
        }

        public string Command { get; private set; }
        public string Description { get; private set; }
        public Action Action { get; private set; }
    }

    static void Main(string[] args)
    {
        var items = new List();

        items.Add(new MenuItem(
            "add",
            "Adds 1 and 2",
            ()=> Console.WriteLine(1+2)));
    }

有关如何在C++中实现此目的的任何建议?我真的不想为每个命令定义单独的类/函数.我可以使用Boost,但不能使用TR1.



1> Johannes Sch..:

一种非常常见的技术是使用由项目名称索引的函数指针或boost :: function,或者使用它们的向量并通过该作业的项索引进行索引.使用项目名称的简单示例:

void exit_me(); /* exits the program */
void help(); /* displays help */

std::map< std::string, boost::function > menu;
menu["exit"] = &exit_me;
menu["help"] = &help;

std::string choice;
for(;;) {
    std::cout << "Please choose: \n";
    std::map >::iterator it = menu.begin();
    while(it != menu.end()) {
        std::cout << (it++)->first << std::endl;
    }

    std::cin >> choice;
    if(menu.find(choice) == menu.end()) {
        /* item isn't found */
        continue; /* next round */
    }   

    menu[choice](); /* executes the function */
}

C++还没有lambda功能,所以你真的必须使用函数来完成这项任务,遗憾的是.你可以使用boost :: lambda,但请注意它只是模拟lambda,并且远不如本机解决方案那么强大:

menu["help"] = cout << constant("This is my little program, you can use it really nicely");

注意使用constant(...),因为否则boost :: lambda不会注意到这应该是一个lambda表达式:编译器会尝试使用std :: cout输出字符串,并分配结果(一个std :: ostream引用到菜单["help"].您仍然可以使用boost :: function,因为它将接受返回void并且不带参数的所有内容 - 包括函数对象,这是boost :: lambda创建的.

如果你真的不想要单独的函数或boost :: lambda,你可以打印出项目名称的向量,然后打印switch用户给出的项目编号.这可能是最简单,最直接的方式.

推荐阅读
k78283381
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有