boost :: container :: vector :: emplace_backがどのように実装されているかを確認してください:
http ://www.boost.org/doc/libs/1_51_0/boost/container/vector.hpp
Boost.Preprocessorを使用して、さまざまな数の引数を取る関数を自動生成します。事前定義された数の関数を生成します。
その結果、各オーバーロードを手作業で作成する必要がありません。代わりに、パターンを1回だけ書き込むことができます。
例えば:
#include <boost/preprocessor/iteration/local.hpp>
#include <boost/preprocessor/repetition/enum.hpp>
#include <boost/preprocessor/repetition/enum_trailing_params.hpp>
struct Entity
{
#define ENTITY_PP_PARAM_LIST(z, n, data) const BOOST_PP_CAT(P, n) & BOOST_PP_CAT(p, n)
#define ENTITY_PP_PARAM_PASS(z, n, data) BOOST_PP_CAT(p, n)
#define BOOST_PP_LOCAL_MACRO(n) \
template<typename GenericType BOOST_PP_ENUM_TRAILING_PARAMS(n, typename P) > \
void AddComponent(BOOST_PP_ENUM(n, ENTITY_PP_PARAM_LIST, _)) \
{ \
something=new GenericType(BOOST_PP_ENUM(n, ENTITY_PP_PARAM_PASS, _)); \
} \
/**/
#define BOOST_PP_LOCAL_LIMITS (0, 3)
#include BOOST_PP_LOCAL_ITERATE()
};
前処理後、次のように展開されます。
struct Entity
{
template<typename GenericType >
void AddComponent()
{
something=new GenericType();
}
template<typename GenericType , typename P0 >
void AddComponent( const P0 & p0)
{
something=new GenericType( p0);
}
template<typename GenericType , typename P0 , typename P1 >
void AddComponent( const P0 & p0 , const P1 & p1)
{
something=new GenericType( p0 , p1);
}
template<typename GenericType , typename P0 , typename P1 , typename P2 >
void AddComponent( const P0 & p0 , const P1 & p1 , const P2 & p2)
{
something=new GenericType( p0 , p1 , p2);
}
};