请原谅任何无知,我是c ++的新手。
我试图在命令行程序中使用boost program_options和命令行解析器。该程序使用getline来获取一些用户输入的命令。我想解析它,所以它可以传递给boost,但我似乎无法使这些类型正确。我还在学习指针和所有爵士乐,但我很难过。
以下是代码,以便您了解我尝试做的事情:
namespace po = boost::program_options;
int _tmain(int argc, _TCHAR* argv[])
{
std::string input;
_TCHAR* parsedInput[20];
while (std::cin) {
std::getline(std::cin, input);
boost::split(parsedInput, input, boost::is_any_of(" "), boost::token_compress_on);
po::options_description desc("allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<int>(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(5, parsedInput, desc), vm);
po::notify(vm);
if (vm.count("help"))
std::cout << desc << "\n";
}
return 0;
}
po::store(po::parse_command_line(5, parsedInput, desc), vm);
当我试图让这项工作正常时,5是任意的。
使用代码我并不完全确定我的问题是什么,但我认为它实际上与分割输入有关,这是当前的错误消息error C2078: too many initializers
。
我最初将输入分成了一个字符串向量,这让我超过了那个错误,但是我遇到了po::parse_command_line(5, parsedInput, desc)
采用错误类型的问题,我认为它不能采用字符串向量。看了documentation之后的确如此。
如果有人能帮助我或指出我正确的方向,我将不胜感激。谢谢。
答案 0 :(得分:1)
您无法拆分为char const*[]
。
相反,将其拆分为std :: string的向量并转换为所需的向量:
#include <boost/program_options.hpp>
#include <boost/algorithm/string.hpp>
#include <iostream>
namespace po = boost::program_options;
int main()
{
std::string input;
while (std::cin) {
std::getline(std::cin, input);
std::vector<std::string> parsedInput;
boost::split(parsedInput, input, boost::is_any_of(" "), boost::token_compress_on);
std::vector<char const*> args { "command" };
for (auto& arg : parsedInput)
args.push_back(arg.c_str());
po::options_description desc("allowed options");
desc.add_options()
("help", "produce help message")
("compression", po::value<int>(), "set compression level")
;
po::variables_map vm;
po::store(po::parse_command_line(args.size(), args.data(), desc), vm);
po::notify(vm);
if (vm.count("help"))
std::cout << desc << "\n";
}
}
请注意,第一个参数(arg[0]
)应该是程序名称
<强> Live On Coliru 强>
allowed options:
--help produce help message
--compression arg set compression level