Mpl :: transform on boost :: fusion :: tuple

The following code does not compile on g++ (GCC) 4.6.0 20110603 (prerelease) with -std=c++0x and Boost 1.46.1 . Am I missing inclusion or is this really a bug? If the latter, how to get around it?

 #include <boost/mpl/vector.hpp> #include <boost/mpl/transform.hpp> #include <boost/mpl/clear.hpp> #include <boost/fusion/mpl.hpp> #include <boost/fusion/include/clear.hpp> #include <boost/fusion/include/clear.hpp> #include <boost/fusion/adapted/boost_tuple.hpp> #include <boost/fusion/include/boost_tuple.hpp> namespace mpl = boost::mpl; template<typename T> struct Meta { T t; typedef mpl::vector<std::function<void(double)>, std::function<void(char)>, std::function<void(int)>> MplVector; typedef T FusionSequence; //works typedef mpl::transform< MplVector, mpl::identity<mpl::_1> >::type result; //doesn't, work typedef typename mpl::transform< FusionSequence, mpl::identity<mpl::_1> >::type result2; }; template<typename T> Meta<T> make_meta(T t) { return Meta<T>({t}); } int main() { auto m = make_meta(boost::make_tuple( std::function<void(double)>([](double) { }), std::function<void(int)>([](int) { }), std::function<void(char)>([](char) { }))); } 
+4
source share
2 answers

If you do not provide inserts, transform should generate one for you (the result should be accumulated somewhere), which essentially means doing something like back_inserter< clear<OriginalSequence>::type > . The transform documents are somewhat misleading here, as they do not document this additional requirement for non-insert versions of the algorithm.

+4
source

If you use fusion :: make_vector instead of make_tuple, you can use mpl :: tranform . A critical trick is also #include <boost/fusion/include/transform.hpp> ! A simple example:

 #include <boost/fusion/include/transform.hpp> #include <boost/fusion/container/vector.hpp> #include <boost/mpl/transform.hpp> // Only works if <boost/fusion/include/transform.hpp> is included: typedef boost::fusion::vector<int> FusionVector; typedef typename boost::mpl::transform<FusionVector, boost::mpl::_1>::type FusionTransformed; 
+2
source

All Articles