C++ boost::选项描述获取默认值
我需要从C++ boost::选项描述获取默认值,c++,boost,boost-program-options,C++,Boost,Boost Program Options,我需要从boost::program\u options::option\u description类中获取默认值 我检查了源代码,看起来它将默认值存储为std::string和boost::any,但它存储在privatem_default_as_text,因此我无法从中提取此信息 我能得到的就是这样格式化的参数 arg(=10) 但我只想要10张 通过调用value\u semantic::apply\u default方法,我还可以获得默认值boost::any boost::any de
boost::program\u options::option\u description
类中获取默认值
我检查了源代码,看起来它将默认值存储为std::string
和boost::any
,但它存储在privatem_default_as_text
,因此我无法从中提取此信息
我能得到的就是这样格式化的参数
arg(=10)
但我只想要10张
通过调用value\u semantic::apply\u default
方法,我还可以获得默认值boost::any
boost::any default_value;
opt_ptr->semantic()->apply_default(default_value)
但是我不知道要执行的确切类型boost::any_cast
当我迭代选项\u description
集合时,我只想打印它
更新
namespace po = boost::program_options;
po::options_description descr("options");
descr.add_options()
("help,h", "produce help message")
("a", po::value<int>()->default_value(42));
for (auto opt: descr.options())
{
std::cout << opt->format_parameter() << std::endl;
}
namespace po=boost::program\u选项;
采购订单:选项描述描述(“选项”);
说明.添加选项()
(“帮助,h”,“生成帮助消息”)
(“a”,po::value()->默认值(42));
对于(自动选项:descr.options())
{
std::cout format_parameter()您可以直接使用(在调用store之后):
if(vm[“a”].defaulted())
{
//已将的值设置为默认值
std::string a_1=vm[“a”].as();
//另一个选项是获取int值并对其进行词法转换
std::string a_2=boost::lexical_cast(vm[“a”].as());
}
其他的
{
//vm[“a”]不是默认值
//那么,为什么需要知道默认值呢?
}
另一个选项(也是更好的方法)是使用boost::lexical_cast将int转换为字符串(将值设置为参数而不是幻数):
constexpr int dv_a=42;
//if(使用C++11)
//常数int dv_a=42;
//如果您不使用C++11
采购订单:选项描述描述(“选项”);
说明.添加选项()
(“帮助,h”,“生成帮助消息”)
(“a”,po::value()->默认值(dv_a));
std::string string_dv_a=boost::词法转换(dv_a);
我不清楚您想做什么。您能在问题中添加一些伪代码吗?当然。更新了问题。一点都不知道?作为一种解决方法,我现在正在解析arg(=42),但我会先提供一些更好的。很抱歉回答得太晚。问题是我不知道vm[“a”]的确切类型
,因此将调用为
可能会引发异常,因为a
可以是任何东西。您抱怨这一点似乎很奇怪。您声明了参数的存储方式。因此,如果您不向变量map传递任何信息(argc=1,argv=program\u name),则参数将被默认;然后只需使用:vm[“a”]。as()
;我真的不明白你的意思,可能问题没有明确描述。我想在不知道原始类型的情况下获取默认值为string。它可以是int、string、double或其他任何类型,我需要的是将其转换为string。我可以从源代码中看到boost在内部将默认值存储为string,但它存储为string一个私有变量,不向用户公开。声明参数的不是我。我只有类型为po::options\u description
的对象,我需要提取默认值。我猜我的意思是,如果你有po::options\u description
,你应该使用库的其他部分提供的机制(解析命令行,将值存储到变量映射中),而不是破坏当前的实现。因此,在这种情况下:po::variables\u map vm;po::store(po::parse\u command\u line(argc,argv,desc),vm);po::notify(vm);
因此,值应该正确地存储到变量映射中(您可以检查它是否如上面所述为默认值)。注意在变量映射上调用as()
,以获取存储为字符串的内容。
if(vm["a"].defaulted())
{
//the value for a was set to the default value
std::string a_1 = vm["a"].as<std::string>();
//the other option is to get the int and lexical_cast it
std::string a_2 = boost::lexical_cast<std::string>(vm["a"].as<int>());
}
else
{
//vm["a"] was not defaulted
//So, why would you need to know the default value?
}
constexpr int dv_a = 42;
//if (using C++11)
//const int dv_a = 42;
//if you are not using C++11
po::options_description descr("options");
descr.add_options()
("help,h", "produce help message")
("a", po::value<int>()->default_value(dv_a));
std::string string_dv_a = boost::lexical_cast<std::string>(dv_a);