「Boost.Protoぺろぺろ - fjnlの生存記録のような何か」を見てから、make_vectorをdecltypeした型を継承すれば、簡単にVariadic Templates対応版Boost.Fusionを作れるんじゃないかと思ってて、それからすっかり忘れてました。
思い出したので書いてみました。
#include <iostream> #include <utility> #include <boost/fusion/include/make_vector.hpp> #include <boost/fusion/include/at_c.hpp> #include <boost/fusion/include/for_each.hpp> #include <boost/mpl/identity.hpp> #include <boost/lambda/lambda.hpp> namespace vt_fusion { template <class... Args> struct vector : boost::mpl::identity<decltype(boost::fusion::make_vector(std::declval<Args>()...))>::type { typedef typename boost::mpl::identity< decltype(boost::fusion::make_vector(std::declval<Args>()...)) >::type base_type; template <class... UArgs> explicit vector(UArgs&&... args) : base_type(std::forward<UArgs>(args)...) {} }; } // namespace vt_fusion namespace fusion = boost::fusion; int main() { const vt_fusion::vector<int, char, double> v(1, 'a', 3.14); std::cout << fusion::at_c<1>(v) << std::endl; fusion::for_each(v, std::cout << boost::lambda::_1 << ' '); std::cout << std::endl; }
a 1 a 3.14
いちおうできてるみたいです。
C++0xの継承コンストラクタがほしいところです。
decltypeした型をわざわざidentityしてから継承してるのは、N3031(Core Issue 950)で解決されるはず。これはGCCでは未実装。