我有一双像这样定义的函数模板:
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 ++编译器有利于&&
超载,显然是因为它是专业化程度较低 。 我想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
}
但是,哇; 这难道让我后最简单的方法?