什么是boost :: program_options :: notify()?

olo*_*ney 32 c++ boost

这个问题是关于C++ Boost program_options库的.

所有的教程都很清楚,我应该调用notify()我已完成的变量映射,但我不确定这对我来说实际上是做什么的.评论它似乎没有任何影响,文档没有详细说明:

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

其他消息来源表明它运行"用户定义"功能.如果是这样,这些功能如何注册,他们做了什么?他们可能会抛出异常吗?

Con*_*ler 27

notify()value_semantic成员函数.它是一个钩子,一旦确定了一个选项的最终值,就可以自动完成应该对该选项采取的任何动作,并将其封装在自己的函数中.这可以防止代码具有一个作用于每个选项的长函数.随着可能的选项的增长,这种程序代码可能会变得难以处理.

您可以在Boost手册中看到设置通知功能的示例:

options_description desc;
desc.add_options()
    ("compression", value<int>()->default_value(10), "compression level")
    ("email", value< vector<string> >()
        ->composing()->notifier(&your_function), "email")
    ;
Run Code Online (Sandbox Code Playgroud)

这些声明指定第一个选项的默认值为10,第二个选项可以出现多次,所有实例都应该合并,解析完成后,库将调用function&your_function,传递"email"的值选项作为参数.

  • 当然,但没有变异变量的能力,将不透明的句柄传递给环境对象,或者绑定到仿函数(比如使用boost :: function),你真的只限于异常和*全局*副作用.这对于更改工作目录或设置全局"详细"标志仍然有用,但是将大量选项解析移动到通知程序中并不常见.也许我应该在做出判断之前尝试一下,我只是在理论上这里. (2认同)

小智 5

当您提到“ functor”时,我认为您的做法正确无误。

通常通过将选项的参数传递给某个对象的方法来对其进行处理。如果可以将方法包装到notifier()将接受作为参数的内容中,则可以使用通告程序更直接地完成此操作。而且可以。(如果boost :: function可以做到这一点,那么我对它还不够熟悉(并且现在还懒得去研究它)-以下内容使用了STDLIB头函数中的例程。)

例:

您的选项之一是--config-file,它带有一个字符串参数,它告诉非默认配置文件的路径。您有一个名为ConfigParser的类。没有通知程序,您的代码可能看起来像这样:

ConfigParser *cp = new ConfigParser();
std::string cp_path;
desc.add_options()
    ("config-file", value<std::string>(&cp_path)->default_value("~/.myconfig"), "Config File")
    // ... the rest of your options
    ;

cp->setPath(cp_path);
Run Code Online (Sandbox Code Playgroud)

带有通知者:

#include <functional>

ConfigParser *cp = new ConfigParser();
desc.add_options()
    ("config-file", value<std::string>()->default_value("~/.myconfig")->notifier(std::bind1st(std::mem_fun(&ConfigParser::setPath), cp)), "Config File")
    // ... the rest of your options
    ;
Run Code Online (Sandbox Code Playgroud)