Devo essere in grado di avere boost::program_options
analizzare una serie di doppi che vengono passati su una riga di comando. Per i doppi positivi, questo non è un problema, ovviamente (usa multitoken con std::vector<double>
in add_options), ma per quelli negativi , so che questi sono argomenti ambigui.Accettare i doppi negativi con boost :: program_options
Ecco una dimostrazione di quello che vorrei prendere in:
mycommand --extent -1.0 -2.0 -3.0 1.0 2.0 3.0 --some-other-argument somevalue
misura deve essere sostenuta da una classe Bounds
con almeno un costruttore che prende in sei singoli T
argomenti (in questo caso - double
).
template <typename T>
class Bounds
{
public:
typedef T value_type;
typedef typename std::vector< Range<T> >::size_type size_type;
typedef typename std::vector< Range<T> > Ranges;
Bounds(T minx, T miny, T minz,
T maxx, T maxy, T maxz)
{
// fill Ranges vector
}
private:
Ranges ranges;
};
Che altro devo fornire a sostegno utilizzando add_options prendono nella classe Bounds
? Mi piacerebbe fare qualcosa di simile a . Possibile?
namespace po = boost::program_options;
po::options_description options("options");
options.add_options()
("extent,e", po::value< Bounds<double> >(), "Extent to clip points to")
po::variables_map vm;
po::store(po::command_line_parser(argc, argv).
options(options).positional(p).run(), vm);
po::notify(vm);
if (vm.count("extent"))
{
Bounds<double> bounds = vm["extent"].as< Bounds<double> >();
// do other stuff
}
Dopo aver parlato con l'autore program_options su IRC, è stato determinato che questo al momento non è possibile. La soluzione è disabilitare le opzioni brevi o utilizzare le virgolette. Ho scelto le virgolette. –
L'ho segnalato come ticket, forse sarà risolto in un prossimo futuro: https://svn.boost.org/trac/boost/ticket/5201 – mloskot