Не существует языковой функции, которая заменяет вариативные шаблоны (конечно, иначе они не были бы изобретены).
Вы можете указать несколько перегрузок, которые принимают до N
параметров (для разумного выбора N
). Каждая перегрузка была бы идеальной - перенаправить свой аргумент в конструктор T
.
Так кроме вашего нульарного шаблона функции:
template <class T>
T *allocate()
{
T *obj = new(top) T();
top += sizeof(T);
return obj;
}
Вы будете иметь унарный шаблон функции:
template <class T, class P1>
T *allocate(P1&& p1)
{
T *obj = new(top) T(std::forward<P1>(p1));
top += sizeof(T);
return obj;
}
бинарный шаблон функции:
template <class T, class P1, class P2>
T *allocate(P1&& p1, P2&& p2)
{
T *obj = new(top) T(std::forward<P1>(p1), std::forward<P2>(p2));
top += sizeof(T);
return obj;
}
трехкомпонентной шаблон функции :
template <class T, class P1, class P2, class P3>
T *allocate(P1&& p1, P2&& p2, P3&& p3)
{
T *obj = new(top) T(std::forward<P1>(p1), std::forward<P2>(p2),
std::forward<P3>(p3));
top += sizeof(T);
return obj;
}
И так далее (вы понимаете). Если вы не согласны с репликацией кода, вы можете выяснить некоторые макросы, которые уменьшат боль, но они не устраняют ее, особенно если вы не любите макросы.
Не забудьте:
#include <utility>
Чтобы получить доступ к std::forward<>()
.
Вы можете эмулировать вариативные шаблоны, используя множество перегрузок для параметров 0, 1, 2, ... N. Boost.Preprocesser может использоваться для их создания. – Angew
Вы можете попытаться реализовать его с помощью макроса C, хотя это * опасно * и не рекомендуется большинством советов по C++ – GuLearn