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 ); };