2016-11-23 14 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

ていますが、明示的にテンプレート引数を提供する必要はありません。この場合、デフォルトのパラメータ値は次のように指定することができます'po :: value'。 '' po :: value(&intoption) ''と '' po :: value(&vecoption) 'は問題ありません。これは関数テンプレートです。 – Barry

答えて

3

タイプstd::vector<double>operator<<の場合はostreamの場合に問題が発生しました。この演算子は、デフォルト値のテキスト表現を提供する必要があります。それは名前空間で定義されていた場合

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

ブーストoperator<<を解決することができます:あなたはoperator<<などを指定することができ、問題を解決するために

/** 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)

boost\program_options\value_semantic.hppヘッダーでは、この要件についてのコメントを見つけることができます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

私は演算子 'std :: ostream&operator <<(std :: ostream&os、const std :: vector &vec){ (size_t i = 0; i Aurelius

+0

上記コメントの2番目の部分をスクラッチしてください。テキスト表現で上記の動作は - > default_value(...) - > multitoken()となります。 ostream'ableバージョンを表示するためにあなたの答えを編集できたら、私はそれをうれしく受け入れます。 – Aurelius

+0

@Aureliusそうですね、上記のコード行に ' - > multitoken()'指定子を追加しました。 – Nikita

関連する問題