C++ で中身が同じ構造体を相互変換する
みたいな話が Lingr の C++ 部屋で出てた。
そういうことを実現したい場合は Boost.Fusion を使うのが現実的かな?
(reinterpret_cast で無理やり変換してしまうという手が無いわけではないのだけれどさすがにアレ過ぎるので。
[ソース]
// 構造が全く同じな型 struct point{ int x; int y; }; struct vec{ int x; int y; }; #include <iostream> #include <boost/fusion/adapted/struct/adapt_struct.hpp> #include <boost/fusion/algorithm/auxiliary/copy.hpp> #include <boost/fusion/include/as_vector.hpp> #include <boost/fusion/include/io.hpp> // Boost.Fusion にアダプトする // アダプトすることで任意の型を Boost.Fusion で扱うことができる BOOST_FUSION_ADAPT_STRUCT( point, (int, x) (int, y) ) BOOST_FUSION_ADAPT_STRUCT( vec, (int, x) (int, y) ) int main(){ namespace fusion = boost::fusion; point p{ 1, 2 }; vec v{ -5, 42 }; std::cout << fusion::as_vector(p) << std::endl; std::cout << fusion::as_vector(v) << std::endl; // p を v に代入 fusion::copy(p, v); std::cout << fusion::as_vector(p) << std::endl; std::cout << fusion::as_vector(v) << std::endl; return 0; }
[出力]
(1 2) (-5 42) (1 2) (1 2)
Boost.Fusion にアダプトすることで Boost.Fusion で任意の型を扱えるようにする事ができるのでそれを利用して処理しています。
Boost.Fusion 便利。
ところで fusion::copy() ではなくて operator = を使って代入する方法ってあるのかな。