标签: boost-program-options

如何在boost :: program_options中接受空值

我正在使用boost :: program_options库来处理命令行参数.我需要通过-r选项接受文件名,万一它是空的(-r没有params)我需要使用stdin.

desc.add_options()
 ("replay,r", boost::program_options::value<std::string>(), "bla bla bla")
Run Code Online (Sandbox Code Playgroud)

在这种情况下,boost不会接受-r而没有params并抛出异常.default_value()选项不起作用,即使用户没有给出-r选项,它也会使库返回值.

任何想法如何解决?

c++ boost boost-program-options

12
推荐指数
2
解决办法
6649
查看次数

boost :: program_options错误或功能?

很简单的例子:



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

namespace po = boost::program_options;

int main(int argc, char* argv[])
{
    po::options_description recipients("Recipient(s)");
    recipients.add_options()
        ("csv",         po::value<std::string>(),     ""  )
        ("csv_name",    po::value<unsigned>(),        ""  )
    ;

    po::options_description cmdline_options;
    cmdline_options.add(recipients);

    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(cmdline_options).run(), vm);
    po::notify(vm);

    return 0;
}


还有一些测试:


>Test --csv test
in option 'csv_name': invalid option value

>Test --csv_name test
in option 'csv_name': invalid option value

>Test --csv_name 0

>Test --csv text
in option 'csv_name': invalid option value

>Test --csv 0

>Test --csv_name 0

>Test --csv_name 0 --csv …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

12
推荐指数
2
解决办法
2355
查看次数

c ++:程序设置 - boost.PropertyTree或boost.program_options?

我一直在寻找一种在C++中存储程序设置或选项或配置的解决方案.这些可能是在GUI中公开的设置,需要在我的代码运行之间保存.

在我的搜索中,我遇到了boost.PropertyTree,这似乎是一个不错的选择.我知道boost是备受推崇的代码,所以我很习惯使用它,所以我开始使用它开发.然后我遇到了boost.program_options,它似乎允许你做同样的事情,但也看起来更专业的程序设置的具体用例.

现在我想知道哪个最适合这份工作?(或者是第三种选择比两者都好)

编辑: fyi这是一个插件,所以它不会使用命令行选项(因为,甚至不可能).

UPDATE

我最后坚持使用boost.PropertyTree.我需要能够将更改的选项保存回INI,并且我没有看到使用boost.program_options执行此操作的方法.

c++ configuration boost boost-program-options boost-propertytree

12
推荐指数
2
解决办法
4012
查看次数

如何在boost :: program_options中为vector <string>指定默认值

我想为代码中的注释提供位置参数的默认值,但编译器会抱怨.这个代码编译得很好.我使用boost 1.46.1和g ++

int main(int argc, char *argv[]) {
    namespace po = boost::program_options;

    po::positional_options_description p;
    p.add("path", -1);

    po::options_description desc("Options");
    std::vector<std::string> vec_str;
    std::string str;
    desc.add_options()
        ("foo,f", po::value< std::string >()->default_value(str), "bar")
        //("path,p", po::value< std::vector<std::string> >()->default_value(vec_str), "input files.")
        ("path,p", po::value< std::vector<std::string> >(), "input files.")
    ;

    po::variables_map vm;
    po::store(po::command_line_parser(argc, argv).options(desc).positional(p).run(), vm);
    po::notify(vm);
}
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

12
推荐指数
1
解决办法
4279
查看次数

BOOST program_options:解析多个参数列表

我想用正值或负值传递多个参数.有可能解析它吗?

目前我有一个以下初始化:

vector<int> IDlist;
namespace po = boost::program_options;     
po::options_description commands("Allowed options");
            commands.add_options()              
                ("IDlist",po::value< vector<int> >(&IDlist)->multitoken(), "Which IDs to trace: ex. --IDlist=0 1 200 -2")
                ("help","print help")
                ;
Run Code Online (Sandbox Code Playgroud)

我想打个电话:

./test_ids.x --IDlist=0 1 200 -2
unknown option -2
Run Code Online (Sandbox Code Playgroud)

因此,program_options假定我传递-2作为另一个选项.

我可以以能够接受负整数值的方式配置program_options吗?

谢谢阿曼.

编辑: BTW我正在通过简单的解析器解析它

store(command_line_parser(argc, argv).options(commands).run(), vm);
Run Code Online (Sandbox Code Playgroud)

,但解决方案是使用扩展的:

parse_command_line
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

11
推荐指数
2
解决办法
1万
查看次数

解析位置参数

考虑从boost程序选项示例中采用的以下简单程序

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

#include <iostream>

int
main( int argc, char** argv )
{
    namespace po = boost::program_options;

    po::options_description desc("Options");

    unsigned foo;
    desc.add_options()
        ("help,h", "produce help message")
        ("foo", po::value(&foo), "set foo") 
        ;

    po::variables_map vm;
    try {
        po::store(
                po::parse_command_line( argc, argv, desc ),
                vm
                );
        po::notify( vm );

        if ( vm.count("help") ) {
            std::cout << desc << "\n";
            std::cout << "boost version: " << BOOST_LIB_VERSION << std::endl;
        }
    } catch ( const boost::program_options::error& e ) {
        std::cerr << …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

11
推荐指数
1
解决办法
6411
查看次数

如何在boost程序选项中有可选的选项值?

我正在使用Boost程序选项,我想提供一个有三种方式的选项:

  1. 如果没有定义
  2. 如果定义但没有价值
  3. 如果定义了值

例如,我有一个程序可以处理a.jpg等文件,我想让用户能够在以下场景中使用它:

myapp.exe a.jpg  : process jpeg 
myapp.exe a.jpg -e : process jpeg and generate report at the same directory as a.jpg
myapp.exe a.jpg -e c:\tmp\ : process jpeg and generate report at c:\tmp\
Run Code Online (Sandbox Code Playgroud)

如何使用Boost程序选项执行此操作?

c++ boost boost-program-options

11
推荐指数
1
解决办法
5245
查看次数

为什么Boost.ProgramOptions不是仅限标题?

一些boost库只是标题库,有些不是,并且由于各种原因等.

是否有特定的原因/设计决定为什么Boost.ProgramOptions不是标题?

我想知道因为它声称它的文档中是一个"小"库,我没有看到任何与系统相关的原因(如线程或asio).

c++ boost boost-program-options header-only

11
推荐指数
1
解决办法
1033
查看次数

使用boost :: program_options解析LPTSTR*命令行参数

使用boost:program_options进行命令行解析时遇到问题.解释它的最快方法是显示代码:

const std::vector<tstring> args;
if (ac > 0 && NULL!=av) //ac is a ULONG
{
    for (int i = 0; i < ac; i++) 
    {
        args.push_back(av[i]); //av is an LPTSTR pointer (pointer to TCHAR*)
    }

    }
    po::command_line_parser parser(args);
Run Code Online (Sandbox Code Playgroud)

解析器ctor应该采用const std :: vector <charT>

typedef basic_command_line_parser<char> command_line_parser;
typedef basic_command_line_parser<wchar_t> wcommand_line_parser;

/** Creates instance of 'command_line_parser', passes parameters to it,
    and returns the result of calling the 'run' method.        
 */
template<class charT>
    class basic_command_line_parser : private detail::cmdline {
    public:
        /** Creates a …
Run Code Online (Sandbox Code Playgroud)

c++ string boost boost-program-options

10
推荐指数
1
解决办法
2224
查看次数

C++ boost :: program_options读取与getopt_long兼容的参数

我正在开发一个现有程序的更新.我正在用boost :: program_options替换Posix的getopt_long().但是我的工作并没有像我应该的那样工作:我希望阅读如下的论点:

-server=www.example.com
-c config.txt
Run Code Online (Sandbox Code Playgroud)

我尝试了boost :: program_options :: command_line_style的许多可能性,但是我找不到能够使行为等于getopt_long的组合.

我发现了这个论点:

-server=www.example.com
Run Code Online (Sandbox Code Playgroud)

我需要旗帜:

command_line_style::allow_long_disguise | command_line_style::long_allow_adjacent
Run Code Online (Sandbox Code Playgroud)

但我有建立标志的问题:

-c config.txt
Run Code Online (Sandbox Code Playgroud)

我找到了旗帜:

command_line_style::allow_short | command_line_style::allow_dash_for_short | command_line_style::short_allow_next
Run Code Online (Sandbox Code Playgroud)

给我几乎我想要的东西.几乎是因为:

ProgramOptionsParserTest.cpp:107: Failure
Value of: params.config
  Actual: " config.txt"
Expected: expectedParams.config
Which is: "config.txt"
Run Code Online (Sandbox Code Playgroud)

所以在使用boost :: algorithm :: trim()后,它将是我想要的.

所以我的问题是:是否可以使用boost :: program_options处理像-c config.txt这样的参数但没有boost :: algorithm :: trim()?

编辑 我注意到上面的标志不适用于未注册的参数.我有注册选项:

  programOptionsDescription.add_options()
      ("help,h", "display help message")
      ("config,c", value<std::string>(), "use configfile")
      ("server,s", value<std::string>(), "server")
      ("ipport,p", value<uint16_t>(), "server port");
Run Code Online (Sandbox Code Playgroud)

但是当我使用未注册的选项时(是的,我有basic_command_line_parser :: allow_unregistered()):

-calibration=something
Run Code Online (Sandbox Code Playgroud)

我知道了:

the argument ('alibration=something') for …
Run Code Online (Sandbox Code Playgroud)

c++ boost getopt-long boost-program-options

10
推荐指数
1
解决办法
500
查看次数