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