Dla pierwszej części, to powinno działać
namespace po = boost::program_options;
po::option_descriptions desc("");
desc.add_options()
("opt", po::value<std::vector<int> >()->multitoken(), "description");
Druga część, wymaga nieco więcej pracy. Funkcja po::value
zwraca po::typed_value< T, charT >
na której trzeba zastąpić zachowanie kilku funkcji, jak następuje
template< typename T, typename charT = char >
class fixed_tokens_typed_value : public po::typed_value< T, charT > {
unsigned _min, _max;
typedef po::typed_value< T, charT > base;
public:
fixed_tokens_typed_value(T * t, unsigned min, unsigned max)
: _min(min), _max(max), base(t) {
base::multitoken();
}
virtual multi_typed_value* min_tokens(unsigned min) {
_min = min;
return *this;
}
unsigned min_tokens() const {return _min;}
virtual multi_typed_value* max_tokens(unsigned max) {
_max = max;
return *this;
}
unsigned max_tokens() const {return _max;}
base* zero_tokens() {
_min = _max = 0;
base::zero_tokens();
return *this;
}
}
który musi towarzyszyć
template< typename T >
fixed_tokens_typed_value<T>
fixed_tokens_value(unsigned min, unsigned max) {
return fixed_tokens_typed_value<T>(0, min, max); }
template< typename T >
fixed_tokens_typed_value<T>
fixed_tokens_value(T * t, unsigned min, unsigned max) {
fixed_tokens_typed_value<T>* r = new
fixed_tokens_typed_value<T>(t, min, max);
return r; }
Następnie
desc.add_options()
("opt", po::fixed_tokens_value<std::vector<int> >(2,2), "description");
powinno działać. Nie miałem jeszcze okazji go przetestować, więc prawdopodobnie zawiera kilka błędów. Ale przynajmniej powinno dać ci wyobrażenie o tym, czego potrzebujesz.
@Szabolcs, ciekawym punkcie z tego kod jest taki, że domyślnie wymaga to użycia wektorów. W przeciwnym razie, w jaki sposób zamierzasz przechowywać wartości? Myślę więc, że 'po :: typedvalue < T, charT >' powinno zostać zmienione na 'po :: typedvalue, charT>'. –
rcollyer
Czy to również działa dla 'std :: array's lub' std :: lists's zamiast wektorów? – einpoklum
@einpoklum Nie rozumiem, dlaczego nie. Ale myślę, że 'std :: array' będzie trochę skomplikowany, ponieważ nie wiem, co jest używane do wstawienia do kontenera, chociaż jest to prawdopodobnie konfigurowalne, a jego stały rozmiar wymagałby jakiejś adaptacji. Natomiast "std :: list" nie ma tych ograniczeń, więc podejrzewam, że można go użyć jako kropli zastępczej. – rcollyer