2010-12-08 6 views
8

私はこのように見えるのブーストバリアント持っている:私はSTDにこの変形の値のいずれかを変換することができるというの必要性を持っているtypedef boost::variant<int, float, double, long, bool, std::string, boost::posix_time::ptime> variant;ブースト::はstdするバリアント<T> ::文字列

を::文字列、私はこれを行うために使用できるいくつかのテンプレート型の関数があるのだろうか?

または、最も効果的な方法は何ですか?

私は現在、複数のオーバーロードされた関数を実装していますが、それぞれが型を取ってからstd::stringstreamを使用して変換するか、posix_timeを使用して変換関数を使用します。おそらくもっと良い方法がありますか?

答えて

9

便宜的なラッパーの背後にあるstringstream物をすべて隠すboost::lexical_castを使用してください。これは適切なoperator<<を持っているので、boost :: posix_timeでも動作します。

1

generically convert from boost::variant<T> to typeを参照してください。あなたはあなたの状況にその答えを適応させることができるはずです。特別な解決策が必要な場合があるboost::posix_time::ptime以外のすべてのタイプにboost::lexical_castを使用できます。オペレータのオーバーロード(テンプレート+ ptimeの1つ)を使用するstatic_visitorのこのすべて。

0

std::stringに特定のタイプを変換するため、よりクリーンでエレガントな(しかし、より効率的ではない)方法は

#include <boost/lexical_cast.hpp>

タイプから

template<typename Target, typename Source> Target lexical_cast(const Source& arg);

変換するために使用することですostreamのための通常の "< <"演算子を提供する必要があります。

使用例: std::string s = boost::lexical_cast<std::string>(17); assert(s == "17");

+0

をコンパイル時に知られている)。しかし質問は 'boost :: variant'に関するものでした。 – UncleBens

3

この試し:タイプの文字列表現の最大長である場合(ブーストストリームバッファのスタック・アレイを使用する必要があり、実際には、より効率的であることができる

struct to_string_visitor : boost::static_visitor<> 
{ 
    std::string str; 

    template <typename T> 
    void operator()(T const& item) 
    { 
    str = boost::lexical_cast<std::string>(item); 
    } 
    void operator()(boost::posix_time::ptime const & item) 
    { 
    //special handling just for ptime 
    } 
}; 

int main(){ 
    variant v = 34; 
    to_string_visitor vis; 
    boost::apply_visitor(vis, v); 
    cout << vis.str << endl; 
} 
+0

テンプレートメソッドを特殊化することはできません。ちょうどそれを通常のテンプレートではない方法にしてください。 –

+0

[OK]を変更しました。私はこれを編集しなかった。 –

+0

いいね!過負荷の強力な使用。 –

関連する問題