g++ (GCC) 4.6.0 20110603 (prerelease)
には、-std=c++0x
とBoost 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) { })));
}
は 'transform'が'にMPLをインスタンス化するために持っているようなことになります:: MplVectorのために成功しますが、唯一のリスト、マップ、セット、ベクトルのためにクリアさがあるので、FusionSequenceのために失敗したclear'、 、 'boost/fusion/mpl/detail/clear.hpp'でデキューしますか?しかし、回避策については考えません。 – Cubbi
@Cubbi私はそれほど推測しましたが、なぜ変換がシーケンスをクリアするのか理解できません。私が知っている限り、変換は 'ForwardSequence'と' tupleS'を必要とします。 'transform'は' ExtensibleSequence'を必要とするために使用され、そのビットは古いバージョンから継承されるかもしれません。しかし、私はそれを非常に疑っています。 – pmr