2014-09-30 193 views
2

我想获得对象的值(标题是这样一个扰流板)。从对象中获取值

该对象可能是指针或不是。我正在寻找一个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 

Ofcourse这些内部类模板,其中T是一个参数使用。我故意避免使用decltype和朋友有事情可实现在C++ 03 :(

是否还有更好的,更consise方式? 请问这个解决方案“规模”到C++ 11 && ?的

回答

5

就超载了指针和非指针的函数,就没有必要使用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); } 
+1

对于C++ 03,添加一个'T const&'重载。 – dyp 2014-09-30 14:57:41

+1

它在没有const超载的情况下工作,重载参考将会推断'T'为'const'类型 – 2014-09-30 15:01:41

+0

这很有帮助。我的印象是,如果'T'是'U&'类型(引用类型),这会产生问题。我也尝试过类似的东西,这就是为什么我结束了所有'remove_ref'的东西。 – 2014-09-30 15:02:05