标签: boost-program-options

可以boost :: program_options使用除" - "之外的分隔符吗?

我正在使用boost :: program_options这样:

namespace po = boost::program_options;
po::options_description desc("Options");
desc.add_options()
  ("help,?", "Show Options")
  ("capture-file,I", po::value<string>(), "Capture File")   
  ("capture-format,F", po::value<string>()->default_value("pcap"), "Capture File Format")
  ("output-file,O", po::value<string>()->default_value("CONOUT$"), "Output File");

po::variables_map vm;
po::store(po::command_line_parser(ac, av).options(desc)./*positional(pd).*/run(), vm);
Run Code Online (Sandbox Code Playgroud)

如果我通过命令行参数-I hithere它的工作原理,但我通过/I hithere升压抛出了boost::bad_any_cast一个what()"使用boost :: any_cast失败的转换"的.

是否可以使用program_options来解析/-delimitted或--delimitted选项?奖金的问题,可以将其进行配置,以便/-设置相同的选项,但在彼此的二元对立?例如,/verbose可能意味着详细记录,而-verbose可能意味着更简洁的记录.

c++ boost-program-options

7
推荐指数
1
解决办法
1656
查看次数

如何使用Boost.program_options检测拼写错误?

我使用boost.program_options库.考虑这个简化的案例.

po::options_description desc("Usage");
desc.add_options()
("uninstall,u", "uninstall program")
("custom,c", po::wvalue<std::wstring>(), "specify custom action");

po::variables_map vm;
po::store(po::parse_command_line(argc, argv, desc), vm);
po::notify(vm);
Run Code Online (Sandbox Code Playgroud)

我想在这样的命令行上产生错误:

testprog.exe -u c- action1
Run Code Online (Sandbox Code Playgroud)

注意,用户输入错误"c-"而不是"-c".但解析器将此理解为单个-u选项.我该如何处理这类案件?

c++ boost boost-program-options

7
推荐指数
1
解决办法
556
查看次数

boost :: program_options"polymorphic"参数

我想使用boost :: program_options创建一个可执行文件,可以调用如下:

./example --nmax=0,10  # nmax is chosen randomly between 0 and 10
./example --nmax=9     # nmax is set to 9
./example              # nmax is set to the default value of 10
Run Code Online (Sandbox Code Playgroud)

以最小的代码以类型安全的方式实现这一目标的最佳方法是什么?

c++ boost boost-program-options

7
推荐指数
1
解决办法
881
查看次数

将boost :: program_options组合成强制组

我正在使用boost :: program_options来处理程序的命令行参数.在下面的程序中,我希望将algo,exchange和admin_port组合在一起,以便它们都应该被提供,否则抛出异常(即除非它们在一起,否则没有意义).

我也想以一种显而易见的方式将它们打印出来.

如何最好地实现这一目标?

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

namespace prog_opts = boost::program_options;

int main(int argc, char *argv[])
{
    int rc = 0;

    prog_opts::options_description desc("Usage");
    desc.add_options()
        ("algo", prog_opts::value<std::string>(), "Name of the algo to run")
        ("exchanges", prog_opts::value< std::vector<std::string> >(), "Name(s) of the exchanges which will be available for use")
        ("admin_port", prog_opts::value<unsigned>(), "Admin port on which admin requests will be listened for")
        ("version", "Show version information")
        ("help", "Show help information");

    prog_opts::variables_map args;

    try
    {
        prog_opts::store(prog_opts::parse_command_line(argc, argv, desc), args); …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

7
推荐指数
1
解决办法
1299
查看次数

boost程序选项:自定义验证器是否需要重载运算符>>?

示例(regex.cpp)中,库的作者为此结构创建了自定义结构(magic_number)和验证函数,以显示如何将自定义结构集成到程序选项中.我按照他的例子为自定义类(MyClass)创建了一个验证函数.编译器抱怨lecical_cast不适用于MyClass.然后std::istream& operator>>(std::istream& in, MyClass& d),我实现,删除void validate(.., MyClass*, ..),代码编译.任何人都可以解释为什么这个例子不需要operator>>,而我的不需要validate

编辑:

#include <MyLib/MyClass.h>

std::istream& operator>>(std::istream& in, MyClass& obj) {
    // some code to populate obj
    return in;
}


po::variables_map parseCommandLine(int argc, char* argv[]) {

    po::options_description options("Options");
    options.add_options()
        ("help", "produce help message")
        ("obj", po::value<MyClass>(), "")
        ;
    po::variables_map vm;
    store(po::command_line_parser(argc, argv)
        .options(options).run(), vm);
    notify(vm);

    return vm;
}

int main(int argc, char* argv[]) {

    try {
        po::variables_map vm = parseCommandLine(argc, argv);

        MyClass obj = vm["my"].as<MyClass>(); …
Run Code Online (Sandbox Code Playgroud)

c++ command-line boost-program-options

7
推荐指数
1
解决办法
2397
查看次数

boost :: program_options是否支持需要一系列备选方案之一?

我正在使用boost :: program_options来指定我的C++应用程序的参数.有没有办法指定一组备选方案中需要一个参数?

<application> [--one int-value1 | --two string-value2 | --three]
Run Code Online (Sandbox Code Playgroud)

另外,在上述中,用户必须通过替代的正好一个:--one,--two,或--three.

我可以手动执行此操作,但希望有一个内置机制而不是这个:

#include <boost/program_options.hpp>

namespace po = boost::program_options;

int main(int argc, char *argv[]) {
  po::options_description options;
  int band;
  std::string titles_path;

  options.add_options()
    ("one", po::value<int>(&band)->default_value(1))
    ("two", po::value<std::string>(&titles_path))
    ("three");

  po::variables_map vm;
  po::store(po::parse_command_line(argc, argv, options), vm);

  if (1 != (vm.count("one") + vm.count("two") + vm.count("three"))) {
    std::cerr << options << std::endl;

    return -11;
  }
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

使用提升选项有更好的方法吗?

c++ boost boost-program-options

7
推荐指数
1
解决办法
751
查看次数

在命名空间的类中使用带有枚举的 boost::program_options

我正在使用 boost::program_options 来解析程序的命令行,并且在尝试将值读取到也在命名空间中的类中的公共枚举中时遇到问题。

规格:

Boost 1.44.0
g++ 4.4.7
Run Code Online (Sandbox Code Playgroud)

我尝试按照Boost Custom Validator for Enum中阐述的过程进行操作,但它对我不起作用。

参数.h

#include <istream>

namespace SA
{
    class Parameters
    {
    public:
        enum Algorithm
        {
            ALGORITHM_1,
            ALGORITHM_2,
            ALGORITHM_3,
            ALGORITHM_4
        };

        friend istream& operator>> (istream &in, Parameters::Algorithm &algorithm);

        Algorithm mAlgorithm;

        <More Parameters>
     }
}
Run Code Online (Sandbox Code Playgroud)

参数.cpp

#include <boost/algorithm/string.hpp>

using namespace SA;

istream& operator>> (istream &in, Parameters::Algorithm &algorithm)
{
    string token;
    in >> token;

    boost::to_upper (token);

    if (token == "ALGORITHM_1")
    {
        algorithm = ALGORITHM_1;
    }
    else if (token == "ALGORITHM_2")
    { …
Run Code Online (Sandbox Code Playgroud)

c++ boost-program-options

7
推荐指数
1
解决办法
6260
查看次数

boost program_options如何工作?

对我来说奇怪的是,boost的options_description使用没有反斜杠或分号或逗号的多行代码.我做了一点研究,但一无所获.

(代码来自官方的boost教程):

int opt;
po::options_description desc("Allowed options"); 
desc.add_options()
    ("help", "produce help message")
    ("optimization"   , po::value<int>(&opt)->default_value(10), "optimization level")
    ("include-path,I ", po::value< vector<string> >()          , "include path")
    ("input-file     ", po::value< vector<string> >()          , "input file") ;
Run Code Online (Sandbox Code Playgroud)

它是如何实现的?这是一个宏吗?

c++ boost boost-program-options

7
推荐指数
2
解决办法
467
查看次数

boost :: program_options位置选项

我有一个位置选项(文件名),我希望它是最后一个选项.基本上,用户可以在命令行上传递一堆东西,并且还使用-F作为文件名.但是,我希望用户也能够将文件名放在最后.

例如

./program --var 3 /path/to/file
Run Code Online (Sandbox Code Playgroud)

我当前实现的代码允许调用者将文件名放在命令行的任何位置.无论如何强迫位置参数总是在"常规"之后?

以下是我设置位置参数的方法:

pos_opts_desc.add("filename", -1);
Run Code Online (Sandbox Code Playgroud)

并解析命令行:

store(
    command_line_parser(argc, argv).options(opts_desc).postional(pos_opts_desc).run(),
    opts_var_map);
Run Code Online (Sandbox Code Playgroud)

在此先感谢您的帮助.

编辑添加:

我完全可以在命令行的任何地方指定-F.但是,如果设置是通过位置选项完成的,我想确保位置选项位于最后.

c++ boost boost-program-options

7
推荐指数
1
解决办法
3386
查看次数

链接到boost :: program_options无法正常工作

存在以下库文件:

cls /usr/local/Cellar/boost/1.51.0/lib $ ls libboost_program*
libboost_program_options-mt.a       libboost_program_options-mt.dylib
Run Code Online (Sandbox Code Playgroud)

我包括以下标题#include <boost/program_options.hpp>:

cls /usr/local/Cellar/boost/1.51.0/include $ ls boost/program_options.hpp
boost/program_options.hpp
Run Code Online (Sandbox Code Playgroud)

我尝试链接库

-lboost_program_options-mt
-L/usr/local/Cellar/boost/1.51.0/lib
Run Code Online (Sandbox Code Playgroud)

(我假设库的名称是从文件名减去"lib"和文件结尾派生的.如果我尝试名字boost_program_options(没有-mt),我得到ld: library not found for -lboost_program_options)

这是我使用库的主要功能:

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

int main(int argc, char **argv) {

    namespace opts = boost::program_options;

    opts::options_description desc("EnsembleClustering options");
    desc.add_options()
            ("hello", "produce greeting");

    opts::variables_map vmap;
    opts::store(opts::parse_command_line(argc, argv, desc), vmap);
    opts::notify(vmap);

    if (vmap.count("hello")) {
        std::cout << "Hello World" << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

为什么这个设置会给我一个symbol(s) not found错误?

make all …
Run Code Online (Sandbox Code Playgroud)

c++ linker boost boost-program-options

6
推荐指数
1
解决办法
4988
查看次数

标签 统计

boost-program-options ×10

c++ ×10

boost ×7

command-line ×1

linker ×1