Когда вам нужно настроить таргетинг на компиляторы до C ++ 0x, вам нужно предоставить псевдо-вариационные шаблоны, т. Е. Вам нужно предоставить функцию шаблона для каждой необходимой арности:
template<class T>
T* alloc() {
/* ... */
}
template<class T, class A0>
T* alloc(const A0& a0) {
/* ... */
}
/* ... */
Вы можете использовать метапрограммирование препроцессора , хотя для обработки повторений, например, используя Boost.Preprocessor или просто генерируя функции с помощью простого скрипта.
Ниже приведен простой пример использования Boost.PP:
#include <boost/preprocessor/arithmetic/inc.hpp>
#include <boost/preprocessor/repetition/enum_binary_params.hpp>
#include <boost/preprocessor/repetition/enum_params.hpp>
template<class T>
T* alloc() {
return new T;
}
#define FUNCTION_ALLOC(z, N, _) \
template<class T, BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), class T)> \
T* alloc(BOOST_PP_ENUM_BINARY_PARAMS_Z(z, BOOST_PP_INC(N), const T, &p)) { \
return new T( \
BOOST_PP_ENUM_PARAMS_Z(z, BOOST_PP_INC(N), p) \
); \
}
BOOST_PP_REPEAT(10, FUNCTION_ALLOC, ~)
#undef FUNCTION_ALLOC
Это генерирует вам alloc()
шаблонные функции для до 10 аргументов.