2

我需要从boost::program_options::option_description类中获取默认值。

我检查了源代码,看起来它同时存储了 asstd::string和 as 的默认值boost::any,但它存储在 private 中m_default_as_text,因此我无法从那里提取此信息。

我能得到的只是这样的格式化参数

参数 (=10)

但我只想得到 10 个。

我也可以boost::any通过调用value_semantic::apply_default方法获得默认值

boost::any default_value;
opt_ptr->semantic()->apply_default(default_value)

但我不知道在boost::any_cast迭代option_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;
}

在这里打印

参数 (=42)

我想在没有类型知识的情况下将 42 作为字符串。

有什么办法吗?

4

1 回答 1

0

您可以只使用(调用商店后):

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?
}

另一种选择(也是更好的方法)是使用 boost::lexical_cast 将 int 转换为字符串(将值设置为参数而不是幻数):

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);
于 2013-11-28T18:22:02.630 回答