Thanks again to @llonesmiz for the code to pretty print the types using typeid(), which helped to understand whats happening.
So it seems the real result type depends on the compiler (probably boost #ifdefs), intel compiler and visual studio convert it back to std::vectorN<> where the maximum N is a predefined number in boost (so it does not work when N is too large). For g++ a mangled type is generated (even 2 different types from my transform calls).
So i guess checking the type via mpl::equal is fine (check the elements of the ranges). If all types should be "really" equivalent (std::is_same holds) i guess you need to convert the result manually to a variadic template class std::tuple.
See http://liveworkspace.org/code/3l8O9K$16 Code Sample
or in short:
template < class T, class R >
struct ToStdTuple;
template < class... TTypes, class X >
struct ToStdTuple< std::tuple< TTypes... >, X >
{
typedef std::tuple< TTypes..., X > type;
};
and then
// typedef mpl::vector<char,short,int,long,float,double> types;
// typedef mpl::transform< types,boost::add_pointer<mpl::_1> >::type result;
typedef mpl::fold< result, std::tuple<>,
ToStdTuple< mpl::_1, mpl::_2 > >::type result_normalized;
resulting in
std::tuple<char*, short*, int*, long*, float*, double*>
for all transformation calls