template<typename T>
class BlockingQueue
{
std::queue<T> container_;
template< typename U >
void push(U&& value)
{
static_assert(std::is_same<T, typename std::remove_reference<U>::type>::value,"Can't call push without the same parameter as template parameter's class");
container_.push(std::forward<U>(value));
}
};
Я хотел бы BlockingQueue :: толчок способ быть в состоянии обрабатывать как RValue и Lvalue ссылку на объект типа T, чтобы направить его std::queue::push
правильной версии. Предпочтительно ли делать код выше, или предоставить две версии метода push внутри моего класса BlockingQueue
? Один для lvalue и один для rvalueстанд: вперед внутри шаблона класса
Я бы написал две перегрузки, одну для 'T const &' и одну для 'T &&' ... –
Вышеупомянутая функция называется «совершенной переадресацией», и она отлично обрабатывает как lvalues, так и rvalues. Я бы так и сделал. (@KerrekSB Hm, означает ли это, что это Q, в основном, основано на мнениях?;) –
@ DanielFrey: назовите его, как хотите, но если вы объедините вывод аргумента с непосредственным ограничением 'is_same' на самом типе, я думаю, вы пытаетесь быть слишком умным. Если вы хотите 'T', просто сделайте перегрузки для' T'. Это короче и легче читать и диагностировать. –