【发布时间】:2012-04-30 00:34:47
【问题描述】:
我有以下两个函数模板重载:
template<typename T>
optional<T> some(const T& x)
{
return optional<T>(x);
}
template<typename T>
typename std::enable_if<std::is_rvalue_reference<T&&>::value, optional<T> >::type
some(T&& x)
{
return optional<T>(std::move(x));
}
我第一次尝试通过完美转发统一过载失败:
template<typename T>
optional<T> some(T&& x)
{
return optional<T>(std::forward<T>(x));
}
error: forming pointer to reference type 'const std::basic_string<char>&'
我的第二次尝试也是这样:
template<typename T>
optional<typename std::remove_reference<T>::type> some(T&& x)
{
return optional<typename std::remove_reference<T>::type>(std::forward<T>(x));
}
error: no matching function for call to
'std::basic_string<char>::basic_string(gpa::optional<const std::basic_string<char> >)'
有没有一种干净的方法来统一重载,还是我应该忍受它们?
【问题讨论】:
-
您应该提供
optional<>的定义。 -
它基本上是
boost::optional的玩具克隆。 -
...但问题仍然存在,您能提供定义吗?我感觉问题出在
optional的接口上(即完美转发是some的解决方案,您可能需要调整它以适应optional)
标签: c++ templates rvalue-reference move-semantics perfect-forwarding