使用boost :: program_options打印普通和位置参数的帮助

时间:2013-01-02 17:30:57

标签: c++ boost command-line-arguments boost-program-options

当您使用Boost库program_options时,可以很容易地为您的程序打印帮助:

boost::program_options::variables_map options;
boost::program_options::options_description optionsDesc;
boost::program_options::positional_options_description positionalOptionsDesc;
//...
if(options.count("help"))
{
    cerr << optionsDesc << endl;
}

但是如何将positional_options_description中的选项添加到帮助消息中?在本教程中,我可以在该部分的末尾看到这种设置的输出:

http://www.boost.org/doc/libs/1_52_0/doc/html/program_options/tutorial.html#id2607297

选项input-file打印在帮助中,它是位置的。但我看不到代码。 是否有内置的方式来打印它,就像使用options_description一样,或者您必须手动执行此操作?显然<<positional_options_description不起作用,编译错误是:

error: cannot bind ‘std::ostream {aka std::basic_ostream<char>}’ lvalue to ‘std::basic_ostream<char>&&’

3 个答案:

答案 0 :(得分:4)

请注意,流媒体描述仅打印出选项。它不会打印程序的名称或程序的实际描述。您应该手动打印输出消息中的任何位置参数:

而不是

if (vm.count("help")) {
    cout << "Usage: options_description [options]\n";
    cout << desc;
    return 0;
}

你可以很容易地说

if (vm.count("help")) {
    cout << "Usage: " << argv[0] << " [options] <description of positional 1> <description of positional 2> ...\n";
    cout << desc;
    return 0;
}

答案 1 :(得分:1)

看一下boost :: program_options :: positional_options_description.name_for_position(i)

错误信息是无关的,我忘了与cpp11

有什么关系

答案 2 :(得分:0)

这是我自动打印位置选项的方法:

void printUsage(const std::string &argv0)
{
    std::ostream &os = std::cout;

    os << "Usage:" << std::endl;

    // print only basename of argv[0]
    boost::filesystem::path p(argv0);
    os << "  " << p.filename().string();

    os << " [options]";

    std::string last = "";
    int rep = 0;
    for(int i = 0; i < positional_options_description_.max_total_count(); i++)
    {
        const std::string &n = positional_options_description_.name_for_position(i);
        if(n == last)
        {
            if(!rep) os << " ...";
            if(rep++ > 1000) break;
        }
        else
        {
            os << " " << n;
            last = n;
            rep = 0;
        }
    }
    os << std::endl << std::endl;
    os << options_description_ << std::endl;
}

仅当您具有可以重复无数次(即count等于-1)的重复选项时,才需要使用用于检查重复参数名称的逻辑。否则,您可以将其简化一点,例如将if... else if ...替换为os << " " << n;

在当前(1.68)版本的boost中,无法判断选项描述是否为位置描述,因此无助于改善帮助,例如,排除位置选项的显示。