4

g++ (GCC) 4.6.0 20110603 (prerelease)次のコードは、 と-std=c++0xでコンパイルされませんBoost 1.46.1。インクルードがありませんか、これは実際にはバグですか? 後者の場合、それを回避する方法は?

#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

2 に答える 2

4

インサーターを提供しない場合、 はあなたのためにインサーターを生成する必要があります (結果はどこかtransformに蓄積される必要があります) 。ドキュメントは、アルゴリズムの「挿入なし」バージョンに対するこの追加の要件を文書化していないため、ここでは誤解を招く可能性があります。back_inserter< clear<OriginalSequence>::type >transform

于 2011-06-21T21:38:06.890 に答える
2

make_tupleの代わりにfusion::make_vectorを使用する場合は、 mpl:: tranformを使用できます。重要なトリックはまたすること#include <boost/fusion/include/transform.hpp>です!簡単な例は次のとおりです。

#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;
于 2011-07-21T20:55:17.987 に答える