2009-11-14 55 views
9

當我構建了一個類似於限制性病精度::在升壓默認值的COUT :: options_description

options.add_options() 
    ("double_val", value(&config.my_double)->default_value(0.2), "it's a double"); 

一個boost :: options_description實例,後來想擁有的可用選項自動輸出我的程序,並把

std::cout << options << std::endl; 

默認值0.2顯示爲具有太高的精度,從而有效地雜波我的輸出時,我有很長的變量名:

--double_val (=0.20000000000000001) it's a double 

不幸的是,先前調用到std :: cout.precision沒有幫助:

cout.precision(5); 
std::cout << options << std::endl; 

這導致仍有相同的輸出:/

你對如何限制任何想法顯示默認值爲更少的位置?

最好的問候, 基督教

回答

10

boost/program_options/value_semantic.hpp:(!從來沒有與升壓肯定的事)

/** Specifies default value, which will be used 
     if none is explicitly specified. The type 'T' should 
     provide operator<< for ostream. 
    */ 
    typed_value* default_value(const T& v) 
    { 
     m_default_value = boost::any(v); 
     m_default_value_as_text = boost::lexical_cast<std::string>(v); 
     return this; 
    } 

    /** Specifies default value, which will be used 
     if none is explicitly specified. Unlike the above overload, 
     the type 'T' need not provide operator<< for ostream, 
     but textual representation of default value must be provided 
     by the user. 
    */ 
    typed_value* default_value(const T& v, const std::string& textual) 
    { 
     m_default_value = boost::any(v); 
     m_default_value_as_text = textual; 
     return this; 
    } 

所以執行是死的簡單。嘗試重新配置ostream以使格式符合您的需要將無法使用,因爲默認值僅在獨立ostringstreamlexical_cast內)中轉換爲字符串。

因此,一個簡單的解決方法是將所需的字符串表示作爲第二個參數添加到default_value。然後,您可以將其打印出來(但不包括,如果您傳遞空字符串)。像這樣:

value(&config.my_double)->default_value(0.2, "0.2") 

更「enterprisey」的方式來完成同樣的事情將是實現自己的類型,其將包裹double,用於config.my_double,並double提供從建築和強迫命令,你很自己的ostream& operator<<與你想要的格式完全相同。但是,我不建議這種方法,除非你正在編寫一個需要普遍性的庫。

從升壓詞彙演員筆記:

以前版本的lexical_cast的 使用默認流精度 讀寫浮點 號碼。對於具有 對應專業化 std :: numeric_limits的數字,當前 版本現在選擇匹配的精度爲 。

3

爲了避免手工引述:

#define QUOTE(x) #x 
#define stringize(x) QUOTE(x) 

#define MY_DOUBLE_DEFAULT 0.2 

value(&config.my_double)->default_value(MY_DOUBLE_DEFAULT, stringize(MY_DOUBLE_DEFAULT))