This can be done without a lot of additional code. The secret is to separate the parsing step from the storage phase, just like in this answer .
The parser will return a container with keys / values, since the parameters are presented from the user. If the parameter is passed several times, then the container will have a separate entry for each parameter feed. It is very simple to scan a specific option and arrange its values, but we want to.
Here is an example that prints each input parameter of several tokens on a separate line:
#include <iostream>
#include <string>
#include <vector>
#include <boost/program_options.hpp>
namespace po = boost::program_options;
int main(int argc, char *argv[]) {
po::options_description desc("Allowed options");
desc.add_options()
("list", po::value<std::vector<std::string>>()->multitoken(), "multiple values");
po::parsed_options parsed_options = po::command_line_parser(argc, argv)
.options(desc)
.run();
std::vector<std::vector<std::string>> lists;
for (const po::option& o : parsed_options.options) {
if (o.string_key == "list")
lists.push_back(o.value);
}
po::variables_map vm;
po::store(parsed_options, vm);
for (size_t i = 0; i < lists.size(); ++i) {
for (size_t j = 0; j < lists[i].size(); ++j)
std::cout << lists[i][j] << ' ';
std::cout << '\n';
}
return 0;
}
And here is an example of invocation ( lives in coliru ):
$ ./po --list 1 2 3 --list foo bar --list how now brown cow
1 2 3
foo bar
how now brown cow