boost program_options如何工作?

时间:2014-07-29 11:30:47

标签: c++ boost boost-program-options

对我来说奇怪的是,提升 options_description 使用不带反斜杠或分号或逗号的多行代码。我做了一点研究,但一无所获。

(代码取自official boost's tutorial):

int opt;
po::options_description desc("Allowed options"); 
desc.add_options()
    ("help", "produce help message")
    ("optimization"   , po::value<int>(&opt)->default_value(10), "optimization level")
    ("include-path,I ", po::value< vector<string> >()          , "include path")
    ("input-file     ", po::value< vector<string> >()          , "input file") ;

如何实施?它是一个宏吗?

2 个答案:

答案 0 :(得分:18)

这在C ++中有点奇怪的语法,但是如果你熟悉JS(例如),你可能会意识到方法链接的概念。这有点像。

add_options()返回定义了operator()的对象。第二行在第一行返回的对象上调用operator()。该方法返回对原始对象的引用,因此您可以连续多次调用operator()

以下是其工作原理的简化版本:

#include <iostream>

class Example
{
public:
    Example & operator()(std::string arg) {
        std::cout << "added option: " << arg << "\n";
        return *this;
    }
    Example & add_options() {
        return *this;        
    }
};

int main()
{
    Example desc;
    desc.add_options()
        ("first")
        ("second")
        ("third");
    return 0;
}

正如gbjbaanb在评论中所指出的,这实际上与分配a = b = c = 0的链接如何适用于类非常相似。它也类似于使用ostream::operator<<时非常理所当然的行为:您希望能够std::cout << "string 1" << "string 2" << "string 3"

答案 1 :(得分:7)

add_options()方法返回实现“()”运算符的对象,而()运算符依次返回相同的对象。请参阅以下代码:

class Example
{
public:
    Example operator()(string arg)
    {
        cout << arg << endl;
        return Example();
    }
    Example func(string arg)
    {
        operator()(arg);
    }
};

int main()
{
    Example ex;
    ex.func("Line one")
           ("Line two")
           ("Line three");
    return 0;
}

这是它的工作方式。