
For those interested in the entire file (Somewhat large), here you go: #ifndef BOOST_PP_IS_ITERATING # ifndef vfx_input_InputSource_hpp__ # define vfx_input_InputSource_hpp__ # include <boost/preprocessor/iterate.hpp> # include <boost/preprocessor/repetition.hpp> # include <boost/preprocessor/logical.hpp> # include <boost/preprocessor/punctuation.hpp> # include <boost/function.hpp> # include <boost/signals.hpp> # include <vfx/input/include/detail/no_param.hpp> # ifndef MAX_PARAMETERS # define MAX_PARAMETERS 5 # endif namespace vfx { namespace input { template<typename t_return, BOOST_PP_ENUM_PARAMS(MAX_PARAMETERS, typename t_param)> class InputSource; }} // end namespace vfx::input # define BOOST_PP_ITERATION_LIMITS (1, MAX_PARAMETERS) # define BOOST_PP_FILENAME_1 "InputSource.hpp" # include BOOST_PP_ITERATE() # endif // vfx_input_InputSource_hpp__ #else # define i BOOST_PP_ITERATION() # define INPUT_repeat(z, n, user) user namespace vfx { namespace input { template<typename t_return, BOOST_PP_ENUM_PARAMS(i, typename t_param)> class InputSource< t_return, BOOST_PP_ENUM_PARAMS( i, t_param ) BOOST_PP_COMMA_IF( BOOST_PP_AND(BOOST_PP_NOT_EQUAL(i, 0), BOOST_PP_NOT_EQUAL(i, MAX_PARAMETERS)) ) BOOST_PP_ENUM( BOOST_PP_SUB(MAX_PARAMETERS, i), INPUT_repeat, detail::no_param ) > { private: typedef typename boost::function<t_return (BOOST_PP_ENUM_PARAMS(i, t_param))> FunctionType; typedef typename boost::signal<t_return (BOOST_PP_ENUM_PARAMS(i, t_param))> SignalType; SignalType m_observers; public: void Publish( BOOST_PP_ENUM_BINARY_PARAMS(i, const t_param, ¶m) ) { m_observers(BOOST_PP_ENUM_PARAMS(i, param)); } void Subscribe( FunctionType slot ) { m_observers.connect( slot ); } }; }} // end namespace vfx::input # undef i #endif // BOOST_PP_IS_ITERATING