可変個引数テンプレートを置き換える言語機能はありません (もちろん、そうでなければ発明されなかったでしょう)。
最大 までのパラメータを受け入れる複数のオーバーロードを提供でき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<>()
。