OK, I worked it out. I couldn't get this to compile:
typedef
typename boost::mpl::if_c<IS_OUTER,
typename PAYLOAD::key_type,
PAYLOAD
>::type
testing;
The problem is that I can't have the type specification
PAYLOAD::key_type, it has to be disconnected to allow lazy evaluation to
work. The following compiles and works:
template <
bool F , typename T >
struct
get_key_type_if { typedef typename T type; };
template
< typename T >
struct
get_key_type_if<true, T> { typedef typename T::key_type type;
};
typedef
typename
get_key_type_if<IS_OUTER,
PAYLOAD>::type testing;
Ah, finally, I have an MPL variant that works:
struct
get_key_type {
template
<
typename
T >
struct
apply {
typedef
typename
T::key_type type; }; };
typedef
typename
boost::mpl::eval_if_c<IS_OUTER,
typename
boost::mpl::apply<get_key_type,
PAYLOAD>,
typename
boost::mpl::identity<PAYLOAD>
>::type
testing;
Is this as simple as it gets?