読者です 読者をやめる 読者になる 読者になる

Fusion Sequenceにアダプトした標準の型を、入力ストリームから読み込む方法

C++

std::pairをIOしたい、というのは誰もが一度は思うところです。
Oの方は簡単です。Fusion Sequenceにアダプトしてas_vectorすればいいのです。

#include <iostream>
#include <string>
#include <sstream>
#include <utility>
#include <boost/assert.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/fusion/include/as_vector.hpp>
#include <boost/fusion/include/io.hpp>

namespace fusion = boost::fusion;

int main()
{
    const std::pair<int, int> p(1, 0);

    std::stringstream ss;
    ss << fusion::as_vector(p);

    BOOST_ASSERT(ss.str() == "(1 0)");
}

問題はIの方です。これは一体どうすればいいのか。as_vectorはfusion::vectorの一時オブジェクトを返すので出力のように簡単にはいきません。
一番簡単な方法はこれでした:

#include <iostream>
#include <string>
#include <sstream>
#include <utility>
#include <boost/assert.hpp>
#include <boost/fusion/include/std_pair.hpp>
#include <boost/fusion/include/io.hpp>

namespace fusion = boost::fusion;
using namespace boost::fusion::operators; // これ

int main()
{
    std::pair<int, int> result;

    std::stringstream ss;
    ss << "(1 0)";
    ss >> result;

    BOOST_ASSERT(result == std::make_pair(1, 0));
}

はい、boost::fusion::operatorsをusing directiveしましょう。出力の方もこうすればas_vectorする必要はありません。
これより簡単な方法は、最初からstd::pairを使わずにfusion::vectorを使うことです。


ちなみにstd::pairは、バージョン番号を表現するのによく使ってます。
std::pairといった感じです。それをファイルフォーマットの先頭に書き込む、というのもよくやるので、入出力どちらもできる必要があるわけです。