Hi Dave,
Thanks for your reply.
David Abrahams wrote:
David Abrahams writes:
Edd Dawson writes:
Hello all,
I have the following:
template<typename T>
void f() { /* ... */ }
typedef boost::mpl::vector my_vec;
I'm looking for a way to call f<T>() for all types T in my_vec. I initially
hoped that either an mpl algorithm or fusion::for_each might be able to
accomplish this for me, but after reading through their docs this doesn't appear
to be the case.
struct call_f
{
template <class Wrapper>
void operator()(Wrapper)
Sorry, it's missing a "const" right here--^^^^
{
f<typename Wrapper::type>();
}
};
mpl::for_each >(call_f());
I didn't find this in the docs. Is it meant to be there?
Unfortunately, that didn't quite work for me, anyway. A requirement of for_each
(according to my MSVC 8 diagnostics) is that each type in the sequence must be
default constructible.
The (near) exact code I'm trying to compile is:
struct register_cage
{
template<typename wrapper>
void operator()(wrapper) const
{
// ...
}
};
struct null_type { };
// template
template<
BOOST_PP_ENUM_PARAMS_WITH_A_DEFAULT(BOOST_MPL_LIMIT_VECTOR_SIZE,
typename T, null_type)
>
struct catch_exceptions
{
typedef typename boost::mpl::vector<
BOOST_PP_ENUM_PARAMS(BOOST_MPL_LIMIT_VECTOR_SIZE, T)
>::type exception_types;
catch_exceptions()
{
using namespace boost::mpl;
typedef boost::mpl::_1 my1;
typedef boost::mpl::_2 my2;
// Remove all null_type entries and then sort the remaining ones,
// most derived to front.
typedef remove_if<
exception_types,
boost::is_same<_, null_type>
>::type unique_exception_types;
typedef sort<
unique_exception_types,
boost::is_base_of
>::type sorted_exception_types;
for_each >(register_cage());
}
};
// Elsewhere, in 'client' code
catch_exceptions();
The most appropriate part of the (long) compiler error is:
1>c:\development\boost\include\boost-1_33_1\boost\utility\value_init.hpp(34) :
error C2512: 'std::runtime_error' : no appropriate default constructor available
1>
c:\development\boost\include\boost-1_33_1\boost\utility\value_init.hpp(34) :
while compiling class template member function
'boost::vinit_detail::non_const_T_base<T>::non_const_T_base(void)'
Assuming that I have interpreted the compiler errors correctly, is this
default-constructible requirement really necessary? I can do the task using the
trick I listed in my original post so I would expect a library of this kind to
be able to.
Kind regards,
Edd