- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我的一些选项有多个级别,例如“冗长”。我希望我的用户在以下两种等效样式之间进行选择:
// no argument: verbosity of 1
my_program -v
// count the 'v's: verbosity of 4
my_program -vv --something_else XYZ -vv
// specify the value: verbosity of 4
my_program --verbose 3
使用 Boost program_options 库执行此操作的最简单方法是什么?
最佳答案
这就是我设想的代码使用方式。
level_value
代替正常的 program_options::value
option_level<CHAR>(your_value)
其中 CHAR
是短选项字母,your_value
是可选级别,例如冗长,正在提供#include <boost/program_options.hpp>
using namespace boost;
using namespace boost::program_options;
int main()
{
unsigned verbosity = 0U;
unsigned something_else = 0U;
options_description desc("options");
desc.add_options()
("verbose,v",
level_value(option_level<'v'>(&verbosity)),
"Print more verbose messages at each additional verbosity level.")
("something_else,s",
value<unsigned>(&something_else);
return 0;
}
# verbosity = 7
test_options -vvvvv --something_else 5 -vv
# final verbosity of 3 overrides
test_options -vvvvv --something_else 5 -v 7 -v 3
# no argument always increments: verbosity = 6
test_options -v 3 --verbose 5 -v
我们需要一些东西来保持水平:
//________________________________________________________________________________________
// t_option_level
//________________________________________________________________________________________
struct t_option_level {
public:
unsigned n;
explicit t_option_level(unsigned n_ = 0):n(n_){}
t_option_level& inc(unsigned by = 1){n += by; return *this;}
t_option_level& set(unsigned val){n = val; return *this;}
};
template <typename U>
inline t_option_level* option_level(U* u)
{return reinterpret_cast<t_option_level*>(u);}
递增或设置值的逻辑存在于验证器中:
#include <boost/program_options.hpp>
#include <boost/program_options/options_description.hpp>
//________________________________________________________________________________________
//
// validate
//________________________________________________________________________________________
template <unsigned SHORT_NAME>
void validate(boost::any& v,
const std::vector<std::string>& values,
t_option_level<SHORT_NAME>* /*target_type*/, int)
{
using namespace boost::program_options;
//
// Get the current value
//
t_option_level<SHORT_NAME> i;
if (!v.empty())
i = boost::any_cast<t_option_level<SHORT_NAME>>(v);
//
// Extract any arguments
//
const std::string& s = validators::get_single_string(values, true);
if (s.empty())
{
v = boost::any(i.inc());
return;
}
char short_name = SHORT_NAME;
// multiple 'values's
if (s == std::string(s.length(), short_name))
{
v = boost::any(i.inc(s.length() + 1));
return;
}
// match number
boost::regex r("^(\\d+)$");
// Do regex match and convert the interesting part to
// int.
boost::smatch what;
if (regex_match(s, what, r))
{
v = boost::any(i.set(boost::lexical_cast<unsigned>(s)));
return;
}
else
{
throw validation_error(validation_error::invalid_option_value, "\"" + s + "\" is not a valid argument.");
}
}
这提供了 program_options::value_semantic
重写以允许零个或一个参数:
template<class T, class charT = char>
class t_level_value : public boost::program_options::typed_value<T, charT>
{
public:
/** Ctor. The 'store_to' parameter tells where to store
the value when it's known. The parameter can be NULL. */
t_level_value(T* store_to)
: boost::program_options::typed_value<T, charT>(store_to)
{}
unsigned min_tokens() const
{
return 0;
}
unsigned max_tokens() const
{
return 1;
}
};
template<class T>
t_level_value<T>*
level_value(T* v)
{
return new t_level_value<T>(v);
}
关于c++ - 使用 Boost program_options 指定级别(例如 --verbose),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17093579/
我正在尝试解析从命令行输入的列表。 我的类是从向量派生的 编译器提示重载验证不明确。我知道为什么,但不知道如何解决这个问题。 请帮忙。 下面是一个生成错误的最小示例。如果将 ch_list 的类型更改
使用 boost::program_options,当它在命名空间内声明时,我无法获得自己的选项类型进行编译。但是在命名空间之外它编译并工作正常: #include using namespace
我目前正在尝试在我的模拟中实现 boost::program_options 库。在读取(许多)参数时,我想做这样的事情 namespace po = boost::program_options;
我目前正在尝试重做一些传递给我的代码。代码的原始点是读取配置文件,并在boost::program_options::variable_map中设置文件中的不同选项,然后读取该代码的其他所有部分,这些
我正在尝试使用 Boost::program_options 读取配置文件。配置文件如下所示: hier.arch.y.option_name = 0x5 another.hier.archy.set
#include #include #include #include void basic_approach(int argc, char const *argv[]) { try
我无法找出使用 boost::program_options 的链接错误。这是一个示例 C++ 代码: # sample_code.cpp #include int main() { boo
我正在尝试在配置文件的值中使用井号 ('#')。 我的用例是一个音乐程序,其中的值给出了吉他乐谱的调音。因此,在值中支持“#”是强制性的,并且不支持任何解决方法,这与可以使用“b”模拟的平面不同。 我
我正在尝试了解 program_options 自定义验证,以便将 python 代码转换为 c++ 代码。 无论如何 我在示例中读到我必须重载验证函数 我试图在 boost program_opti
我目前正在阅读 Boost.Program_options 教程。 这是他们介绍的一些代码: // Declare the supported options. po::options_descrip
海湾合作委员会 4.7.2/ boost 1.58.0 我正在尝试看起来像这样的代码,几乎完全取自文档中的示例: namespace po = boost::program_options; po::
我使用 ubuntu 10.04 和 libboost1.40。 ls -l /usr/lib | grep boost_pro -rw-r--r-- 1 root root 64080
boost::program_options 似乎支持某种级别的 custom validation但对我来说,验证是根据类型而不是每个参数编写的,这似乎很奇怪,我想知道我是否在这里遗漏了什么。 例如
构建我的项目时,Boost_LIBRARIES 不包含 program_options,即使它是必需的并且已找到。如果我手动添加它,它工作正常。我的 CMake 包含以下内容: find_packag
我对 boost::program_options 有疑问 我有课 namespace po = boost::program_options; class imageProcess{ private
program_options 是少数几个不只是头文件(因此需要单独编译)的 Boost 库之一。 我需要在未安装 Boost 的集群中运行我在 PC 上编译的程序。我没有安装 Boost 的管理权限
在 debian stretch 和 gcc 6.4.0 上,boost 1.66.0 boost::program_options 总是用空值解析命令行。代码如下: #include #inclu
我正在尝试从源代码构建第 3 方 C++ 库,它依赖于 Boost。在构建的最后一步,我得到了这样的错误: [ 90%] Linking CXX executable Shannon_RNASeq_C
我在使用 boost:program_options 时遇到问题 这个简单的程序,从 boosts 的文档中复制粘贴: #include int main( int argc, char** arg
一开始不解析参数,而是在程序已经运行了一段时间的某个时间解析从管道读取的输入字符串。 boost::program_options 可以这样做吗? 谢谢。编辑: 我必须在 python 中使用不同的参
我是一名优秀的程序员,十分优秀!