그냥 스크립트 짜는게 훨씬 편하지만 신기하니까.. -_-
@내부 구현은 recursive define 으로 되어있음.
#define SOME_GEN4(n, GEN_DEF) GEN_DEF(n) SOME_GEN3(n-1, GEN_DEF)
이런식. 대충 255개까지 predefine되어있음.
저 위에서 n-1은 유효한 preprocessor token이 아니므로 실은 약간 더 복잡한 define이 있음. BOOST_PP_SUB 뭐 이런거.
@따라서 255개 이상 만들 수 없음. 컴파일 시간 조올라 길어질 수 있음.
---
#define PARAM_DEF(z, n, u) BOOST_PP_COMMA_IF(n) ARG_T##n &arg##n
#define BOOST_PP_LOCAL_MACRO(n) \
template< class T BOOST_PP_COMMA_IF(n) BOOST_PP_ENUM_PARAMS(n, class ARG_T) > \
T *newObject( BOOST_PP_REPEAT(n, PARAM_DEF, u) ) \
{ \
T *obj = new T( BOOST_PP_ENUM_PARAMS(n, arg) ); \
_items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; \
return obj; \
}
#define BOOST_PP_LOCAL_LIMITS (0, 4)
#include BOOST_PP_LOCAL_ITERATE()
#undef CTOR_DEF
#undef PARAM_DEF
--- 결과 ---
template< class T > T *newObject( ) { T *obj = new T( ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }
template< class T , class ARG_T0 > T *newObject( ARG_T0 &arg0 ) { T *obj = new T( arg0 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }
template< class T , class ARG_T0 , class ARG_T1 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 ) { T *obj = new T( arg0 , arg1 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }
template< class T , class ARG_T0 , class ARG_T1 , class ARG_T2 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 , ARG_T2 &arg2 ) { T *obj = new T( arg0 , arg1 , arg2 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }
template< class T , class ARG_T0 , class ARG_T1 , class ARG_T2 , class ARG_T3 > T *newObject( ARG_T0 &arg0 , ARG_T1 &arg1 , ARG_T2 &arg2 , ARG_T3 &arg3 ) { T *obj = new T( arg0 , arg1 , arg2 , arg3 ); _items[reinterpret_cast<void *>(obj)] = _objectDestructor<T>; return obj; }












최근 덧글