Я не знаком с конкретным синтаксисом, который вы используете здесь с Boost, я обычно использую vm ["output"]. As (). Однако, как я вижу, ваша проблема не в Boost, а в командной строке Windows.
При вводе команды:
.\a.exe -i inputfile -o "output path\" -x
Конечная двойная кавычка после пути экранируется символом \. Насколько я понимаю, использование двух символов \ решает вашу проблему. Однако, если вы абсолютно не можете использовать \\ вместо \, я не уверен, что вам сказать.
.\a.exe -i inputfile -o "output path\\" -x
Вот мой вывод с синглом \
>.\a.exe -i inputfile -o "output path\" -x
1 .\a.exe
2 -i
3 inputfile
4 -o
5 output path" -x
opts.output =
vm.count("output") = 1
vm("output").as<std::string>() = output path" -x
vm.count("xmlfilter") = 0
А вот и с двойным \
>.\a.exe -i inputfile -o "output path\\" -x
1 .\a.exe
2 -i
3 inputfile
4 -o
5 output path\
6 -x
opts.output =
vm.count("output") = 1
vm("output").as<std::string>() = output path\
vm.count("xmlfilter") = 1
Для справки вот код, который я запустил (немного отличается от вашего), который печатает данные непосредственно из входного массива argv в main.
#include <boost/program_options.hpp>
#include <iostream>
namespace po = boost::program_options;
struct Options
{
std::string input;
std::string output;
std::string xmlfilter;
};
int main (int argc, char* argv[])
{
using namespace std;
Options opts;
po::options_description desc("OPTIONS");
desc.add_options()
("input,i", po::value<string>(&opts.input)->required(), "input file")
("output,o", po::value<string>(&opts.output)->required(), "output folder path")
("xmlfilter,x", po::value<string>(&opts.xmlfilter)->implicit_value(""), "enable XML filtering (optionally specify config file)")
;
po::variables_map vm;
store(parse_command_line(argc, argv, desc), vm);
for (int i = 0; i < argc; ++i)
cout << i+1 << " " << argv[i] << endl;
cout << endl;
cout << "opts.output = " << opts.output << endl;
cout << "vm.count(\"output\") = " << vm.count("output") << endl;
cout << "vm(\"output\").as<std::string>() = " << vm["output"].as<std::string>() << endl;
cout << "vm.count(\"xmlfilter\") = " << vm.count("xmlfilter") << endl;
return 0;
};