【问题标题】:Getting boost program options to persist after function scope获得提升程序选项以在功能范围后持续存在
【发布时间】:2017-10-30 16:10:58
【问题描述】:

我有一个函数,它接受boost::program_options::options_description,添加一些选项,然后返回东西。似乎我的选项在函数范围结束后没有持续存在,并且我的选项消失了。如何让他们坚持下去?

#include <boost/program_options.hpp>
#include <utility>


void generic_args(boost::program_options::options_description desc, boost::program_options::positional_options_description p) {
    desc.add_options()
        ("input", boost::program_options::value<std::vector<std::string>>(), "input files")
        ("help,h", "produce help message")
        ("verbose,v", "put the pretty words and numbers on the light screen");

    p.add("input", -1);
}

int main(int argc, const char** argv) {
    boost::program_options::options_description desc("Allowed options");
    boost::program_options::positional_options_description p;
    generic_args(desc, p);
    boost::program_options::variables_map parameters;
    boost::program_options::store(boost::program_options::command_line_parser(argc, argv).options(desc).positional(p).run(), parameters);
    boost::program_options::notify(parameters);
    return 0;
}

这是输出:

scott@beast:~/test/test_args$ g++ -std=c++11 main.cpp -o a.out -lboost_program_options
scott@beast:~/test/test_args$ ./a.out
scott@beast:~/test/test_args$ ./a.out --help
terminate called after throwing an instance of 'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::program_options::unknown_option> >'
  what():  unrecognised option '--help'
Aborted (core dumped)

【问题讨论】:

  • 我建议在深入研究第三方库之前至少学习基本的 C++。使用参考参数。
  • 我是一名 Python 程序员。使用第三方库对我来说非常有意义。从我的角度来看,C++ 内存管理是这里的高级主题。 :)

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


【解决方案1】:

您应该更改 generic_args 以通过引用获取参数:

void generic_args(boost::program_options::options_description &desc,
                  boost::program_options::positional_options_description &p)
{
  // ...
}

目前generic_args 修改了descp副本(它们是按值传递的)。

查看Does C++ pass objects by value or reference?What's the difference between passing by reference vs. passing by value? 了解更多详情。

【讨论】:

  • 知道了。我习惯了像 Java 和 Python 这样的语言,其中“大”对象总是通过引用传递。
  • 欢迎使用 C++,除非您这样做,否则没有任何引用。一旦你内化了那个,你被那些引用可能变得陈旧的事实所困扰。至少几次(一百次)。直到您学会始终意识到生命周期并偏爱价值语义。
猜你喜欢
  • 1970-01-01
  • 2020-11-25
  • 2016-04-10
  • 2012-07-02
  • 2015-02-06
  • 2016-05-20
  • 2021-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多