我有一对这样定义的函数模板:
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
}
但是哇;这真的是获得我所追求的最简单的方法吗?