2014-08-28 6 views
7

Ist es möglich, minimale und maximale Grenze eines Wertes (angenommen, es ist kurz vorzeichenlos und ich brauche einen Wert zwischen 0 und 10) als ich kann den Standardwert vonBoost Programm Optionen Einstellung Min- und Max-Wert für Option

setzen
opt::value<unsigned short>()->default_value(5) 

Ich möchte Argumente aus der Variablen-Map von Programmoptionen sofort verwenden, ohne jede von ihnen zu überprüfen.

Antwort

7

Nein, das geht nicht. Alle Optionen sind beschrieben here. Sie können sie manuell überprüfen oder eine Funktion schreiben, die sie manuell überprüft.

opt::value<unsigned short>()->default_value(5)->notifier(&check_function); 

wo Prüffunktion wie etwas

ist
void check(unsigned short value) 
{ 
    if (value < 0 || value > 10) 
    { 
     // throw exception 
    } 
} 

oder allgemeinere

template<typename T> 
void check_range(const T& value, const T& min, const T& max) 
{ 
    if (value < min || value > max) 
    { 
     // throw exception 
    } 
} 

opt::value<unsigned short>()->default_value(5)->notifier 
(boost::bind(&check_range<unsigned short>, _1, 0, 10)); 
+0

Dies ist eine gute Antwort, danke. –

7

In C++ 11 dies auch Lambda-Ausdrücke erreicht werden kann.

opt::value<unsigned short>() 
    ->default_value(5) 
    ->notifier(
     [](std::size_t value) 
     { 
     if (value < 0 || value > 10) { 
      // throw exception 
     } 
     }) 

Dies hält handlicher den Validierungscode selbst nahe an der Meldestelle und ermöglicht es Ihnen, die Ausnahme einfacher, so etwas wie

throw opt::validation_error(
    opt::validation_error::invalid_option_value, 
    "option_name", 
    std::to_string(value)); 
7

Ich empfehle eine Lambda individuell angepasst werden (wie kaveish'sanswer). Sie können jedoch eine Funktion zurückgeben lassen, die die entsprechenden Grenzen überprüft, um alles lesbarer zu machen.

auto in = [](int min, int max, char const * const opt_name){ 
    return [opt_name, min, max](unsigned short v){ 
    if(v < min || v > max){ 
     throw opt::validation_error 
     (opt::validation_error::invalid_option_value, 
     opt_name, std::to_string(v)); 
    } 
    }; 
}; 

opt::value<unsigned short>()->default_value(5) 
    ->notifier(in(0, 10, "my_opt")); 
+0

Ich mag diese Lösung sehr. Einmal kleine Änderungen - ich habe 'in' eine Template-Funktion mit dem Typ von' min', 'max' und' v' als Template-Parameter gemacht. – alan

Verwandte Themen