C++ boost程序选项:通知没有值的选项

C++ boost程序选项:通知没有值的选项,c++,boost-program-options,C++,Boost Program Options,只有当解析的选项具有值\u语义时,才能使用通知程序。 由给定的通知程序自动处理无值选项的最佳方式是什么 简单的方法是使用隐式赋值生成一个伪值,这样用户就可以在没有值的情况下传递选项。 这导致了显式提供值的可能性。 如果提供了值,可以添加运行时检查并抛出错误 更新: 但是,这在存在位置选项的情况下不起作用,因为位置选项的值可以跟在无值选项后面,将异常作为其给定值引发。使用zero\u标记修饰符。您似乎还需要使用隐式_值,但是选项名称后面提供的任何内容都不会被选项解析器使用。相反,当在命令行上注意到

只有当解析的选项具有值\u语义时,才能使用通知程序。 由给定的通知程序自动处理无值选项的最佳方式是什么

简单的方法是使用隐式赋值生成一个伪值,这样用户就可以在没有值的情况下传递选项。 这导致了显式提供值的可能性。 如果提供了值,可以添加运行时检查并抛出错误

更新:
但是,这在存在位置选项的情况下不起作用,因为位置选项的值可以跟在无值选项后面,将异常作为其给定值引发。

使用
zero\u标记
修饰符。您似乎还需要使用
隐式_值
,但是选项名称后面提供的任何内容都不会被选项解析器使用。相反,当在命令行上注意到该选项时,将为该选项指定隐式值,从而触发该选项的通知程序(因此请确保提供通知程序功能)。显然,选项的值类型为
string
也很重要。我不清楚为什么

void got_foo(std::string const&);

desc.add_options()
  ("foo", 
   po::value<std::string>()
     ->implicit_value("")
     ->zero_tokens()
     ->notifier(&got_foo),
   "foo description")
;
void got_foo(std::string const&);
说明添加选项()
(“富”,
po::value()
->隐式_值(“”)
->零辅币()
->通知程序(&got_foo),
“foo描述”)
;

俄罗斯程序员论坛上的一个家伙OXPEHOMETP给了我一些建议,建议我使用
boost::program\u options::bool\u switch()

当通过允许值的接口定义没有值的选项时,必须将非
boost::program_options::typed_value()
作为语义传递,而是
bool_switch()
。这意味着不能从命令行显式获取此选项的值。
您可以在

上找到有关它的信息。这是一个完整的示例,说明如何提供一个标志作为补充当前答案的选项:

#include <iostream>

#include <boost/program_options.hpp>

using namespace std;

namespace po = boost::program_options;


int main(int ac, char* av[])
{
    po::options_description desc("Allowed options");

    desc.add_options()
        ("help", "produce help message")
        ("overwrite,o", po::bool_switch()->default_value(false),
                        "enable file overwrite");

    po::variables_map vm;
    po::store(po::parse_command_line(ac, av, desc), vm);

    boolalpha(cout);  // display true and false for bool
    cout << "overwrite is: " << vm["overwrite"].as<bool>() << endl;

    return 0;
}
在没有任何选项的情况下运行程序会导致:

./untitled4
overwrite is: false
但是,使用“-o”选项/标志运行时会给出:

./untitled4 -o
overwrite is: true

是的,这是我最初的方法。但是,如果在传递的键之后有一个位置选项,那么它必须由got_foo正确填充。这很棘手而且不干净,基于一些技术问题在不同的选项之间产生了不必要的关系。我不明白。当我在测试命令行上通过
--foo
之后的非选项时,其值不会存储在
foo
的选项值中。
foo
选项获取值
,因为它的隐式值就是这个值。您误解了
implicit\u value()
选项,它只在没有提供值的情况下工作,但是一些值跟随它使用的键,而不是隐式值。所以,下一个传递的位置选项的值将用作非值选项的值。查看:
my\u程序-使用位置选项(无值)键(值)
。这里的
位置选项\u值
将被视为
键,在
隐式\u值()
中带有\u no\u值
的传递值方法使用bool\u开关的示例:
(“normalize\u regularizer,n”,po::bool\u开关()->默认值(false),“normalize regularization常量”)
,我发现boost.po文档中没有包含它。非常感谢。如果不明显,程序选项的bool_开关()和value()一样,可以选择使用一个指向变量的指针来保存该值(bool_开关()的类型为bool),因此假设例如
bool clobber预先声明您可以有
(“覆盖,o”,po::bool_开关(&clobber)->默认值(false),“启用文件覆盖”)
./untitled4 -o
overwrite is: true