boost::program_options 命令行选项 子命令

http://www.boost.org/doc/libs/1_55_0/doc/html/program_options.html

http://www.radmangames.com/programming/how-to-use-boost-program_options

<span style="font-family:Microsoft YaHei;font-size:14px;">#include<boost/program_options.hpp>
#include<iostream>
#include<string>

namespace po = boost::program_options;
int main(int argc, char* argv[])
{
    try {
        po::options_description global("Global options");
        global.add_options()
            ("command", po::value<std::string>(), "command to execute")
            ("subargs", po::value<std::vector<std::string> >(), "Arguments for command");
            ;

        po::positional_options_description pos;
        pos.add("command", 1).
            add("subargs", -1);

        po::variables_map vm;
        po::parsed_options parsed = po::command_line_parser(argc, argv).options(global).positional(pos).allow_unregistered().run();
        po::store(parsed, vm);
        po::notify(vm);

        std::string cmd = vm["command"].as<std::string>();
        if (cmd == "add")//cmd == "add"
        {
            po::options_description desc("Allowed options");
            desc.add_options()
                ("help,h", "produce help message")
                ("compression,c", po::value<string>()->default_value("world"), "set compression level")
                ;

            std::vector<std::string> opts = po::collect_unrecognized(parsed.options, po::include_positional);
            opts.erase(opts.begin());
            po::store(po::command_line_parser(opts).options(desc).run(), vm);
            po::notify(vm);

            if (vm.count("help")) {
                cout << desc << "\n";
                return 1;
            }

            if (vm.count("compression")) {
                cout << "Compression level was set to "
                    << vm["compression"].as<string>() << ".\n";
            } else {
                cout << "Compression level was not set.\n";
            }
        }
        else if(cmd == "ls")
        {
            std::cout << "ls" << std::endl;
        }
    }
    catch(exception& e) {
        std::cout << "available command:" << std::endl;
        std::cout << "add" << std::endl;
        std::cout << "ls" << std::endl;
        cerr << "error: " << e.what() << "\n";
        return 1;
    }
    catch(...) {
        cerr << "Exception of unknown type!\n";
    }

    return 0;
}</span>


你可能感兴趣的:(boost::program_options 命令行选项 子命令)