2014-09-30 192 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