我想获取一个对象的值(标题就是这样的破坏者)。
该对象可以是指针,也可以不是。我正在寻找一个STL函数,该函数将是std::decay
我到目前为止所拥有的看起来像这样:
template<typename T>
typename std::enable_if<std::is_pointer<T>::value,
typename std::add_reference<typename std::remove_pointer<T>::type>::type>::type
deref(T val)
{ return *val; } // lets call it the * policy
template<typename T>
typename std::enable_if<!std::is_pointer<T>::value,
typename std::add_reference<T>::type>::type
deref(T& val)
{ return val; } // lets call it the plain policy
当然,这些是在类模板中T
用作参数的地方使用的。我故意避免使用decltype
和朋友来使事情在C ++ 03中实现:(
有没有更好,更简洁的方法?该解决方案是否可以“扩展”到C ++ 11 &&
?
只需重载指针和非指针的函数,就无需使用SFINAE或类型特征:
template<typename T>
T& deref(T* val)
{ return *val; }
template<typename T>
T& deref(T& val)
{ return val; }
为了实现完美的转发,请使用转发参考,std::forward
而不要使用第二个重载:
template<typename T>
T&& deref(T&& val)
{ return std::forward<T>(val); }
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句