25

我正在编写一个使用 Boost 程序选项库的程序,我注意到以下语法自从我看到它以来一直困扰着我:

desc.add_options()
        ("help","produce help message")
        ( /* other flag, value, description pairs here */)
;

我看到在标题中, operator() 被覆盖,但我不确定这如何使它在语法上是正确的。

其次,与多次调用 add_options() 相比,这种语法有什么优势(除了炫耀你可以像这样操作语法之外)?

4

2 回答 2

23

add_options成员函数返回一个类型为 的对象options_description_easy_init。后者已operator()重载以返回对自身的引用。这使您可以像在代码段中显示的那样链接调用。

链接调用和add_options多次调用之间的区别在于,在前一种情况下,options_description_easy_init会创建一个单独的实例,并且每次调用operator()它时,它都会将选项添加到所有者 ( options_description)。如果您要add_options多次调用,则每次调用都会创建一个新的options_description_easy_init.

于 2012-05-07T17:57:07.347 回答
14

优势问题是主观的,但在这种情况下它很简洁。

与我的一个家庭项目进行比较:

("help,h", "Generate this help message")
("output-file,o", po::value<std::string>(), "Output filename. Required.")
("tangent,t", "Generate/load tangent-space basis.")
("collada-output,c", "Write a Collada file, rather than our mesh XML format.")
("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.")
("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.")
("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.")
("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n"
        "Name # # # #\n"
        "\n"
        "Each # is an attribute index to use for this VAO.\n"
        "Each VAO name must be unique; you cannot use the same VAO in the same place.")

对此:

visible.add_options()("help,h", "Generate this help message")
visible.add_options()("output-file,o", po::value<std::string>(), "Output filename. Required.")
visible.add_options()("tangent,t", "Generate/load tangent-space basis.");
visible.add_options()("collada-output,c", "Write a Collada file, rather than our mesh XML format.");
visible.add_options()("arrays,a", "Write arrays instead of indexed verts. Cannot combine with Collada writing.");
visible.add_options()("flip-tangent,f", "Change the tangent-space basis matrix's handedness. Negates bitangent.");
visible.add_options()("map", po::value<std::string>(), "Map filename. Defaults to the ColladaConv directory's 'stdmap.txt' file.");
visible.add_options()("vao", po::value<std::vector<std::string> >(), "Sequence of mappings, of the form:\n"
        "Name # # # #\n"
        "\n"
        "Each # is an attribute index to use for this VAO.\n"
        "Each VAO name must be unique; you cannot use the same VAO in the same place.");

行长很重要。并且不必visible.add_options()在所有内容之前都可以使其更易于阅读。

于 2012-05-07T19:09:47.440 回答