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::push мог обрабатывать как ссылку rvalue, так и ссылку lvalue объекта типа T, чтобы перенаправить его на std::queue::push
правильную версию. Что предпочтительнее сделать, как в приведенном выше коде, или предоставить две версии метода push внутри моего класса BlockingQueue
? Один для lvalue и один для rvalue
T const &
и одну дляT &&
... - person Kerrek SB   schedule 01.11.2013is_same
для самого типа, я думаю, вы пытаетесь быть слишком умным. Если вам нуженT
, просто сделайте перегрузку дляT
. Он короче и легче для чтения и диагностики. - person Kerrek SB   schedule 01.11.2013static_assert
, так как мой разум просто пропустил его за ненадобностью, и я бы удалил его. - person Daniel Frey   schedule 01.11.2013static_assert
кажется неправильным. Разве вы не хотите поддерживать константные значения? То, что вы действительно должны проверить, этоis_convertible<U,T>::value
. Другой способ справиться с этим -enable_if
вместо статического утверждения. Преимуществоenable_if
заключается в том, что вы можете удалить функцию довольно рано из набора перегрузок, чтобы избежать двусмысленностей и вместо этого позволить компилятору указать на вызывающий нарушение пользовательский код. - person sellibitze   schedule 04.11.2013