获取 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]) 应该是程序名

Live On Coliru

allowed options:
  --help                produce help message
  --compression arg     set compression level