Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/svg/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ boost::选项描述获取默认值_C++_Boost_Boost Program Options - Fatal编程技术网

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
,但它存储在private
m_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);