这里最简单的解决方案是使参数成为转发参考.这样你就可以只使用一个函数:
templatevoid push(U&& data) { if (full()) { throw Invalid{}; } long offset = counter.in % size; // please note here we construct a T object (the class template) // from an U object (the function template) new (buffer + offset) T{std::forward(data)}; ++counter.in; }
但是方法有一些缺点:
它不是通用的,也就是说它不能总是这样做(以微不足道的方式).例如,当参数不像T(例如SomeType
)那么简单时.
您延迟参数的类型检查.当使用错误的参数类型调用push时,可能会出现长且看似无关的编译器错误.
顺便说一下,在你的例子T&&
中不是转发参考.这是一个右值参考.那是因为T不是函数的模板参数.这是类,因此在实例化类时已经推断出它.所以编写代码的正确方法是:
void push(T&& data) { ... ... T{std::move(data)}; ... } void push(const T& data) { ... T{data}; ... }