2014-08-28 8 views
7

विकल्प के लिए न्यूनतम और अधिकतम मान को सेट करने के लिए बूस्ट प्रोग्राम विकल्प बूस्ट करें (मान लीजिए कि यह मानी गई न्यूनतम और अधिकतम सीमा निर्धारित है और मुझे 0 और 10 के बीच मान की आवश्यकता है) क्योंकि मैंविकल्प

द्वारा डिफ़ॉल्ट मान सेट कर सकता हूं
opt::value<unsigned short>()->default_value(5) 

मैं उनमें से प्रत्येक को जांच किए बिना तुरंत प्रोग्राम विकल्पों के चर मानचित्र से दिए गए तर्कों का उपयोग करना चाहता हूं।

उत्तर

7

नहीं, आप नहीं कर सकते। सभी विकल्पों का वर्णन here है। आप उन्हें मैन्युअल रूप से देख सकते हैं, या फ़ंक्शन लिख सकते हैं, जो उन्हें मैन्युअल रूप से जांचेंगे।

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

जहां चेक समारोह

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

या अधिक सामान्य

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

यह अच्छा जवाब है, धन्यवाद। –

7

की तरह कुछ सी ++ 11 यह भी लैम्ब्डा भाव का प्रयोग कर प्राप्त किया जा सकता है है।

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

यह handily सत्यापन कोड ही कॉल बिंदु के करीब की तरह

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

कुछ मैं एक लैम्ब्डा (जैसे kaveish'sanswer) की सिफारिश रहता है और आप अपवाद कस्टमाइज़ करने में आसान अनुमति देता है। लेकिन आप इसे एक ऐसा फ़ंक्शन वापस कर सकते हैं जो सबकुछ अधिक पठनीय बनाने के लिए उपयुक्त सीमाओं की जांच करता हो।

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

मुझे यह समाधान बहुत पसंद है। एक बार मामूली चिमटा - मैंने टेम्पलेट पैरामीटर के रूप में 'min',' max', और 'v' के प्रकार के साथ एक टेम्पलेट फ़ंक्शन बनाया। – alan

संबंधित मुद्दे