|
Boost Users : |
Subject: [Boost-users] [mpl] lazy condition in enable_if
From: Sam Fisher (infest21h_at_[hidden])
Date: 2015-01-28 14:22:37
Hi,
I need to run boost::mpl::for_each<> function with template condition, like:
boost::mpl::for_each< vector_of_types,
boost::mpl::make_identity<boost::mpl::_1> > (Functor< condition >());
I'm trying to implement lazy binding in enable_if.
Visual studio fails with error "'X<IsFoo<boost::mpl::_>>::operator ()' :
ambiguous call to overloaded function"
minimal test code which fail on boost 1.57
#include <boost/mpl/for_each.hpp>
#include <boost/mpl/lambda.hpp>
#include <boost/mpl/bind.hpp>
#include <boost/mpl/vector.hpp>
#include <boost/core/enable_if.hpp>
#include <iostream>
#include <type_traits>
template <int> struct dummy { dummy(int) {} }; // from doc
struct Foo {};
struct Bar {};
template <typename T>
struct IsFoo
{
typedef typename std::is_same<T, Foo>::type type;
};
#define generate_type(_fn) \
typename boost::mpl::apply<boost::mpl::bind< \
boost::mpl::lambda< _fn <boost::mpl::_> >::type, \
boost::mpl::bind<typename boost::mpl::lambda<_Pred>::type, U> \
> >::type
#define enable_type generate_type(boost::enable_if)
#define disable_type generate_type(boost::disable_if)
template <typename _Pred>
struct X
{
template <typename U>
enable_type operator()(boost::mpl::identity<U>, dummy<0> = 0) const
{
std::cout << "enable: " << typeid(U).name() << std::endl;
}
template <typename U>
disable_type operator()(boost::mpl::identity<U>, dummy<1> = 0) const
{
std::cout << "disable: " << typeid(U).name() << std::endl;
}
};
int main()
{
X<IsFoo<boost::mpl::_> > x;
x(boost::mpl::identity<Foo>());
x(boost::mpl::identity<Bar>());
return 0;
}
Boost-users list run by williamkempf at hotmail.com, kalb at libertysoft.com, bjorn.karlsson at readsoft.com, gregod at cs.rpi.edu, wekempf at cox.net