У меня есть пара шаблонов функций, определенная следующим образом:Шаблон дедукции разрешение/перегрузка способствует T && над сопзЬ T &
template<typename CollectionType>
Foo<CollectionType> f(const CollectionType& v)
{
return Foo<CollectionType>(v); // copies v into a member variable
}
template<typename CollectionType>
Foo<CollectionType> f(CollectionType&& v)
{
return Foo<CollectionType>(std::move(v)); // moves v into a member variable
}
Если я называю f
как показано ниже:
std::vector<int> v;
f(v);
В VC++ компилятор благоволит &&
перегрузка, видимо, потому что это less specialized. Я бы хотел, чтобы в этом случае была вызвана перегрузка const&
- версия &&
предназначена для таких конструкций, как f(ReturnAVector())
. Есть ли способ достичь этого без указания аргумента шаблона вручную?
После изрядного количества усилий, я пришел с этим:
template<typename CollectionType>
Foo<CollectionType> f(const CollectionType& v)
{
return Foo<CollectionType>(v); // copies v into a member variable
}
template<typename CollectionType>
typename std::enable_if<std::is_rvalue_reference<CollectionType&&>::value,
Foo<typename std::remove_reference<CollectionType>::type>>::type
f(CollectionType&& v)
{
return Foo<CollectionType>(std::move(v)); // moves v into a member variable
}
Но ничего себе; это действительно самый простой способ получить то, что мне нужно?
Мне нравится идея переадресации, и она работает, как ожидалось. – dlf