$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Peter Dimov (pdimov_at_[hidden])
Date: 2001-12-15 12:13:20
I think that a compile-time port of boost.bind would be a valuable addition
to MPL.
See the end of the message for a starting point. This works on MSVC; a full
port with nested binds and a bind<> syntax (not the numbered bind0, bind1,
... variants) would be possible, too, and is actually not difficult on a
conforming compiler. On MSVC it'd be a bit harder, but doable.
Comments?
--
Peter Dimov
Multi Media Ltd.
#include <iostream>
#include <typeinfo>
// bind
struct _1;
struct _2;
struct _3;
struct _4;
struct _missing;
namespace _bi
{
template<class T> struct select
{
template<class B1, class B2, class B3, class B4> struct apply
{
typedef T type;
};
};
template<> struct select<_1>
{
template<class B1, class B2, class B3, class B4> struct apply
{
typedef B1 type;
};
};
template<> struct select<_2>
{
template<class B1, class B2, class B3, class B4> struct apply
{
typedef B2 type;
};
};
template<> struct select<_3>
{
template<class B1, class B2, class B3, class B4> struct apply
{
typedef B3 type;
};
};
template<> struct select<_4>
{
template<class B1, class B2, class B3, class B4> struct apply
{
typedef B4 type;
};
};
}
template<class F, class A1, class A2> struct bind2
{
typedef bind2 type;
template<class B1 = _missing, class B2 = _missing, class B3 = _missing,
class B4 = _missing> struct apply
{
typedef typename _bi::select<A1>::template apply<B1, B2, B3, B4>::type a1;
typedef typename _bi::select<A2>::template apply<B1, B2, B3, B4>::type a2;
typedef typename F::template apply<a1, a2>::type type;
};
};
// test
template<int I> struct value_wrapper
{
enum { value = I };
};
struct less
{
template<class A, class B> struct apply
{
enum { value = (A::value < B::value) };
typedef value_wrapper<value> type;
};
};
int main()
{
typedef bind2<less, _1, value_wrapper<5> >::type bound;
typedef bound::apply< value_wrapper<2> >::type result;
std::cout << typeid(result).name() << '\n';
}