檢查矢量:: emplace_back如何提高::容器::實現: http://www.boost.org/doc/libs/1_51_0/boost/container/vector.hpp
它採用Boost.Preprocessor用於自動生成取不同數量的參數的函數。它生成一些預定義的函數。
因此,您不必手動編寫每個過載。相反,你可以只寫一次你的模式。
例如:
#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);
}
};
如果您不能使用可變參數模板,總有普通的老式非類型安全的可變參數的功能並通過從內部列表那。 – chris
我實際上正在嘗試做類似的事情,將Direct3D紋理和表面合併爲一個我正在寫的引擎的類。既然我也想要一個答案,先生,這是一個投票。 –
如果您只希望使用少量的模板類型,則可以始終專注於模板功能。 –