Hmm, I think I found the issue. My signal object is const for some reason. I'm doing a lot of tricks to map enums to signal objects, I'll post all the code at the bottom of this message. My fusion::vector either must be containing the signal objects as const, or fusion::at_c must be returning const. I'm not really sure.
namespace detail
{
template< InputSubscription t_sub >
struct sub
{
const static InputSubscription value = t_sub;
};
using boost::mpl::map;
using boost::mpl::pair;
typedef map<
pair< sub<INPUTSUB_KEYBOARD>, boost::signal<void (unsigned int, bool)> >,
pair< sub<INPUTSUB_MOUSE_MOTION>, boost::signal<void (int, int)> >,
pair< sub<INPUTSUB_MOUSE_BUTTON>, boost::signal<void (int, int, unsigned int, bool)> >,
pair< sub<INPUTSUB_MOUSE_WHEEL>, boost::signal<void (int)> >
> SubMap;
}
/// Obtains a boost::signal from a matching InputSubscription identifier.
template< InputSubscription t_sub >
struct GetSignal
{
typedef typename boost::mpl::at<detail::SubMap, detail::sub<t_sub> >::type signal;
};
struct SignalBank
{
boost::fusion::vector<
GetSignal<INPUTSUB_KEYBOARD>::signal,
GetSignal<INPUTSUB_MOUSE_MOTION>::signal,
GetSignal<INPUTSUB_MOUSE_BUTTON>::signal,
GetSignal<INPUTSUB_MOUSE_WHEEL>::signal
> signals;
};
template< InputSubscription t_sub >
static void subscribe( SignalBank const& bank, typename GetSignal<t_sub>::signal::slot_type const& slot )
{
using boost::fusion::at_c;
const_cast<GetSignal<t_sub>::signal>( at_c<t_sub>( bank.signals ) ).connect( slot );
}
void mouseCB( int, int )
{
}
void footest()
{
SignalBank bank;
//boost::fusion::at_c<1>( bank.signals )( 3, 4 );
subscribe<INPUTSUB_MOUSE_MOTION>( bank, &mouseCB );
};