【问题标题】:boost::option_description get default valueboost::option_description 获取默认值
【发布时间】:2013-11-05 17:24:14
【问题描述】:

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

我检查了源代码,看起来它以std::stringboost::any 存储默认值,但它存储在私有m_default_as_text 中,因此我无法从那里提取此信息。

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

arg (=10)

但我只想得到 10 个。

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

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

但是当我迭代 option_description 集合时,我不知道要执行 boost::any_cast 的确切类型,我只想打印它。

更新

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

在这里打印

arg (=42)

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

有什么办法吗?

【问题讨论】:

  • 我不清楚您要做什么。你能在问题中添加更多的伪代码吗?
  • 当然。更新了问题。
  • 完全没有想法?作为一种解决方法,我现在正在解析 arg(=42),但我更喜欢更好的方法。

标签: c++ boost boost-program-options


【解决方案1】:

你可以直接使用(调用 store 之后):

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 转换为字符串(将值设置为 parameter 而不是 ma​​gic number强>):

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);

【讨论】:

  • 抱歉回答晚了。问题是我不知道vm["a"] 的确切类型,所以调用as&lt;int&gt; 可能会引发异常,因为a 可以是任何东西。
  • 您抱怨这一点似乎很奇怪。您声明参数的存储方式。因此,如果你什么都不传递 (argc = 1, argv = program_name) 到变量映射,参数将被默认;然后只需使用:vm["a"].as&lt;std::string&gt;();
  • 我不太明白你的意思,也许这个问题没有明确描述。我想在不知道原始类型的情况下将默认值作为字符串。它可以是 int、string、double 或其他任何东西,我需要将它转换为字符串。我可以从 boost 在内部将默认值存储为字符串的源代码中看到,但它存储为私有变量并且不向用户公开。声明参数的不是我。我只有po::options_description 类型的对象,我需要提取默认值。
  • 我猜我的意思,如果你有一个po::options_description;您应该使用库的其他部分中可用的机制(解析命令行,将值存储到变量映射中),而不是破坏当前的实现。所以,在这种情况下:po::variables_map vm; po::store(po::parse_command_line(argc, argv, desc), vm); po::notify(vm); 因此,值应该正确地存储到变量映射中(并且您可以检查它是否像我上面概述的那样默认)。注意在 variable_map 上调用 as&lt;std::string&gt;() 以获取存储为字符串的内容。
猜你喜欢
  • 2017-10-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-21
  • 2016-01-01
  • 2021-12-01
  • 2018-11-22
  • 2013-11-21
相关资源
最近更新 更多