没有替代可变参数模板的语言功能(当然,否则它们就不会被发明)。
您可以提供几个接受最多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<>()
.