2011-06-21 9 views
4

g++ (GCC) 4.6.0 20110603 (prerelease)には、-std=c++0xBoost 1.46.1で次のコードはコンパイルされません。 インクルードがないか、これは実際にはバグですか?後者の場合、それを回避する方法は?boost :: fusion :: tupleのmpl :: transform

#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) { }))); 
} 
+1

は 'transform'が'にMPLをインスタンス化するために持っているようなことになります:: MplVectorのために成功しますが、唯一のリスト、マップ、セット、ベクトルのためにクリアさがあるので、FusionSequenceのために失敗したclear'、 、 'boost/fusion/mpl/detail/clear.hpp'でデキューしますか?しかし、回避策については考えません。 – Cubbi

+0

@Cubbi私はそれほど推測しましたが、なぜ変換がシーケンスをクリアするのか理解できません。私が知っている限り、変換は 'ForwardSequence'と' tupleS'を必要とします。 'transform'は' ExtensibleSequence'を必要とするために使用され、そのビットは古いバージョンから継承されるかもしれません。しかし、私はそれを非常に疑っています。 – pmr

答えて

4

あなたはインサータを提供していない、transformは基本的にback_inserter< clear<OriginalSequence>::type >のようなものをやってになるこれは、(結果はどこかを蓄積する必要がある)あなたのための1つを生成することがあります。 transform文書はアルゴリズムの「挿入なし」バージョンのこの追加要件を文書化していないため、ここでは誤解を招くことがあります。

2

あなたの代わりにmake_tupleの融合:: 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; 
関連する問題