获取 boost 命令行来解析我提供的数组而不是来自 main 的 argv - 模拟 argv
Get boost command line to parse array i supply rather than argv from main - emulate argv
请原谅我的无知,我是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 确实是这样。
如果有人能帮助我或指出正确的方向,我将不胜感激。谢谢。
您不能拆分成 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]
) 应该是程序名
allowed options:
--help produce help message
--compression arg set compression level
请原谅我的无知,我是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 确实是这样。
如果有人能帮助我或指出正确的方向,我将不胜感激。谢谢。
您不能拆分成 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]
) 应该是程序名
allowed options:
--help produce help message
--compression arg set compression level