2016-11-23 121 views
3

我有一個boost :: program_options選項,可以將所需的輸入選項成功分析到一個向量中,但是我看不到如何給它一個默認值。例如:向量賦值boost :: program_options的默認值

base.add_options() 
("vector_value",po::value<std::vector<double> >(&vecoption)->multitoken(),"description"); 

工作正常讀值到vecoptions,讓人覺得

base.add_options() 
("int_value",po::value<int>(&intoption)->default_value(1),"description"); 

也工作正常,但試圖給向量參數的默認值像

base.add_options() 
("vector_value",po::value<std::vector<double> >(&vecoption)->default_value(std::vector<double>{0,1,2}),"description"); 

給出編譯器錯誤

error: static assertion failed: Source type is neither std::ostream`able nor std::wostream`able

如何創建一個帶有像{0,1,2}這樣的默認值的矢量值浮動選項?

+0

無關,但你並不需要顯式提供模板參數'婆:: value'。只需'po :: value(&intoption)'和'po :: value(&vecoption)'就可以了。這是一個函數模板。 – Barry

回答

3

對於std::vector<double>類型錯過operator<<ostream造成的問題。該操作員需要提供您的默認值的文本表示。在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)

爲了解決這個問題,你可以指定operator<<像:

namespace std 
{ 
    std::ostream& operator<<(std::ostream &os, const std::vector<double> &vec) 
    {  
    for (auto item : vec) 
    { 
     os << item << " "; 
    } 
    return os; 
    } 
} 

加速能夠解決operator<<,如果它在命名空間中的已定義std。在這種情況下默認參數值可以像指定:

("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}), "description"); 

另一種方法是使用方法有明確的文本值規範:

("vector_value", po::value<std::vector<double> >(&vecoption)->multitoken()->default_value(std::vector<double>{0, 1, 2}, "0, 1, 2"), "description"); 
+0

我已經爲(size_t i = 0; i &vec){ ){ os << vec [i] <<「」; } return os; '但是得到相同的錯誤。假設我在OP中的語法錯誤,相應的選項條目會是什麼? 您的「其他方法」適用於默認值,但不再分析以「--vector_value = 1 2 3」形式給出的選項。 – Aurelius

+0

劃傷上述評論的第二部分;用上面的文本表示法工作 - > default_value(...) - > multitoken()。如果你可以編輯你的答案來顯示ostream'able版本,我會很樂意接受它。 – Aurelius

+0

@Aurelius對,我剛剛在上面的代碼行中添加了錯過的' - > multitoken()'說明符。 – Nikita