Um etwas Ähnliches wie find_if
zu implementieren, habe ich das for_each geändert (es exec_if
genannt), um ein bool
Template-Argument anzunehmen. Das bool
gibt an, ob die Ausführung mit den nächsten Sequenzen erfolgen soll oder ob sie effektiv vorzeitig zurückkehren soll.
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
namespace mpl = boost::mpl;
template< bool done = true >
struct exec_if_impl
{
template
static void execute(Iterator*, LastIterator*, Pred const&, Exec const&)
{
}
};
template<>
struct exec_if_impl
{
template
static void execute(Iterator*, LastIterator*, Pred const& f, Exec const& e)
{
typedef typename mpl::deref::type item;
if (!f(static_cast(0)))
{
typedef typename mpl::next::type iter;
exec_if_impl::value>
::execute(static_cast(0), static_cast(0), f, e);
}
else
e(static_cast(0));
}
};
template
inline
void exec_if(Pred const& f, Exec const& e, Sequence* = 0)
{
BOOST_MPL_ASSERT(( mpl::is_sequence ));
typedef typename mpl::begin::type first;
typedef typename mpl::end::type last;
exec_if_impl::value>
::execute(static_cast(0), static_cast(0), f, e);
}
namespace msg
{
struct m1 { enum { TYPE = 1 }; static const char* name() { return "m1"; } };
struct m2 { enum { TYPE = 2 }; static const char* name() { return "m2"; } };
struct m3 { enum { TYPE = 3 }; static const char* name() { return "m3"; } };
struct m4 { enum { TYPE = 4 }; static const char* name() { return "m4"; } };
struct m5 { enum { TYPE = 5 }; static const char* name() { return "m5"; } };
}
struct checker
{
checker(int chk_type) : type(chk_type) {}
template
bool operator()(Mtype* = 0) const
{
return Mtype::TYPE == type;
}
int type;
};
struct exec
{
template
void operator()(Mtype* = 0) const
{
std::cout << Mtype::name() << " executed" << std::endl;
}
};
int main(void)
{
typedef mpl::vector mseq;
checker chk(3);
exec_if(chk, exec());
return 0;
}
Ich habe dies in exec_if
geändert, sodass jetzt, wenn das Prädikat übereinstimmt, der Funktor zur Ausführung mit dem Typ ausgelöst wird - das tut genau das, was ich brauche.