这个问题是关于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的成员函数.它是一个钩子,一旦确定了一个选项的最终值,就可以自动完成应该对该选项采取的任何动作,并将其封装在自己的函数中.这可以防止代码具有一个作用于每个选项的长函数.随着可能的选项的增长,这种程序代码可能会变得难以处理.
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"的值选项作为参数.
小智 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)
| 归档时间: |
|
| 查看次数: |
10943 次 |
| 最近记录: |