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

Variadic Templates対応版Boost.Fusionを作ろう

C++

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では未実装。