标签: boost-program-options

带有 json 文件的 C++ Boost 程序选项

可以使用 boost 程序选项库:http : //www.boost.org/doc/libs/1_64_0/doc/html/program_options.html

在这里读取 json 格式的文件作为输入文件?

或者,如果我在 json 文件中有一些配置,我需要自己解析它,例如:http : //www.boost.org/doc/libs/1_64_0/doc/html/property_tree.html

c++ json boost boost-program-options

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

Visual Studio C++ 远程 linux 调试添加链接器选项

我正在尝试使用 boost 库在 C++ 中开发一个简单的程序。我使用 Visual Studio 2017 和 ubuntu 的远程 bash shell 进行编译和调试。

我在 ubuntu 上安装了 gdb、gdbserver、所有编译器和 boost 库。

没有 boost 的简单程序直接从 Visual Studio 中的 shell 编译和运行没有问题!

当我使用以下命令直接从 ubuntu bash 编译以下程序时:g++ test.cpp -std=c++11 -lboost_program_options -o t它也编译并运行!

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

using namespace boost::program_options;

int main(int argc, const char *argv[])
{
    try
    {
        options_description desc{ "Options" };
        desc.add_options()
            ("help,h", "Help screen");

        variables_map vm;
        store(parse_command_line(argc, argv, desc), vm);
        notify(vm);

        if (vm.count("help"))
            std::cout << desc << '\n';

    }
    catch (const …
Run Code Online (Sandbox Code Playgroud)

ubuntu boost remote-debugging visual-studio boost-program-options

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

在 Visual Studio MSVC 14.0 断言下使用 boost 程序选项失败

我已经在 MSVC 14.0 下编译了 Boost 1.66。我正在尝试将在 Linux 上的 Boost 下运行良好的现有项目移植到 Visual Studio。

那是一段失败的代码:

options.add_options()
            ("help", "Produce help message")
            ("config-file,c", po::value<string>(&config_file_path)->default_value("config.xml"), "Configuration file path")
            ("port,p", po::value<int>(&html_port)->default_value(7999), "HTTP Server port")
            ("html_root,hr", po::value<string>(&html_root)->default_value("."), "Directory root for HTML page");
Run Code Online (Sandbox Code Playgroud)

有以下断言:

Assertion failed: n == name.size()-2, file libs\program_options\src\options_description.cpp, line 177
Run Code Online (Sandbox Code Playgroud)

有什么建议?

c++ boost boost-program-options

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

如何为缺少预定义运算符而不扩展命名空间 `std` 的标准类型定义运算符 &gt;&gt; (istream &amp;, ...)?

显然,向命名空间添加(几乎)任何东西都是未定义的行为std

我使用C ++ 14不具有std::chrono::parse()(C ++ 20只),但我需要类型的deserialise值std::chrono::milliseconds(的特殊化std::chrono::duration从)istream

虽然这有效,但我找不到任何允许它不是 UB 的例外情况:

namespace std {
std::istream& operator >>(std::istream & is, std::chrono::milliseconds & ms) {
    std::string s;
    is >> s;
    ms = std::chrono::milliseconds(std::stoi(s));
    return is;
}
}
Run Code Online (Sandbox Code Playgroud)

由于这两种参数类型都不是我的类型,我不确定如何在std命名空间之外安全地定义这个运算符。

请注意,运算符将在内部深处调用,Boost::program_options因此我认为我无法在自己的命名空间中定义运算符然后使用,using my_ns::operator>>因为该using声明的program_options范围不会扩展到范围内。

我是如何走到这一步的

作为Boost::program_options我的用户,我从存储为std::chrono::milliseconds值的配置文件中读取了一个特定的配置变量:

std::chrono::milliseconds period;
po::options_description config_only_opts;
config_only_opts.add_options()
    ("control.period", po::value<std::chrono::milliseconds>(&period), "Specify the period in milliseconds"); …
Run Code Online (Sandbox Code Playgroud)

c++ namespaces boost-program-options deserialization c++-chrono

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

boost program_options的"多次出现"例外

我在boost的program_options(版本1.42)上编写以下代码.这似乎是直截了当的,并且与本教程非常相似.但是,我收到"multiple_occurrences"错误.进一步调查发现它(可能)是引发它的"文件名"参数.

我给出的参数是:

3 1 test.txt 100
Run Code Online (Sandbox Code Playgroud)

我没有任何见解......任何帮助将不胜感激.

po::options_description common("Common options");

common.add_options()
    ("help", "produce help message")
    ("motif_size", po::value<int>(&motif_size), "Size of motif (subgraph)")
    ("prob", po::value<double>(&prob), "Probably to continue examining an edge")
    ("filename", po::value<string>(&input_filename), "Filename of the input graph")
    ("repeats", po::value<int>(&n_estimates), "Number of estimates")
    ;

po::options_description all;
all.add(common);

po::positional_options_description p;
p.add("motif_size", 0).add("prob", 1).add("filename", 2).add("repeats", 3);

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

c++ boost boost-program-options

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

为什么使用[]运算符会导致编译器错误?

我写了这个快速功能来熟悉boost::program_options.请注意,这po是一个名称空间别名,定义如下: namespace po = boost::program_options.

int application(po::variables_map* vm)
{
    std::cout << vm << std::endl;
    std::cout << *vm["infile"].value();
    // also tried:  std::cout << *vm["infile"]

    return SUCCESS;
}  //application
Run Code Online (Sandbox Code Playgroud)

当我在函数体中注释掉第二行时,应用程序成功编译并打印了地址vm.但是,当我尝试使用此处出现的函数进行编译时,我得到以下编译器侮辱:

invalid types ‘boost::program_options::variables_map*[const char [7]]’ for array subscript
Run Code Online (Sandbox Code Playgroud)

我应该注意用std::cout << vm->count("infile")返回 替换第二行1.

我做错了什么?我是在滥用助推器构造还是在(de)引用中混淆了vm

更新

根据建议我通过引用传递以避免运算符优先级问题,我重写了我的函数:

int application(po::variables_map& vm)
{
    std::cout << &vm << std::endl;
    std::cout << vm["infile"].value();

    return SUCCESS;
}  //application
Run Code Online (Sandbox Code Playgroud)

我现在得到一个不同的错误:

no match for ‘operator<<’ (operand types are …
Run Code Online (Sandbox Code Playgroud)

c++ boost boost-program-options

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