可以使用 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
我正在尝试使用 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
我已经在 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)
有什么建议?
显然,向命名空间添加(几乎)任何东西都是未定义的行为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
我在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) 我写了这个快速功能来熟悉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)