2016-11-18 141 views
3

我有以下推導其參數的返回類型函數返回類型

template<typename U, typename F > 
U GetListAndSearchName(F listGetter, const std::string& stringName) 
{ 
    std::vector<UserType> newList; 
    for (size_t i = 0; i < myList.size(); i++) 
    { 
     const std::vector<U>& list = listGetter(myList[i]); 
     for (size_t i = 0; i < list.size(); i++) 
     { 
      if (list[i]->GetName() == stringName) 
       return list[i]; 
     } 
    } 
    return U(); 
} 

代碼即使ü在這模板參數F我的函數指針的返回類型存在(我使用std ::的mem_fn創建它後來的F可能也是std :: function)目前我需要將U的類型明確地傳遞給編譯器。

如何讓我的舊版Vs2010編譯器推導出U的類型?

+1

你不能。返回類型不能由他們自己推導出來。 – NathanOliver

+2

我已經在特定的標準標籤。我不確定這在C++ 03中很容易解決。 – Bathsheba

+0

你不能在C++ 03中,你可能在C++ 14中用'decltype(auto)' – 101010

回答

6

工程在2010年:

template<typename F> 
auto GetListAndSearchName (F listGetter, const std::string& stringName) 
    -> decltype(listGetter(myList[0])[0]) 
+0

不錯。獲取'::'問題。 – Bathsheba

+0

如果列表爲空 –

+1

@KadirErdemDemir會發生什麼情況'decltype'內部的表達式不會被評估,所以沒有什麼不好的事情發生。 –

4

您需要使用decltype和尾隨返回類型。它們都是C++ 11功能,但根據MSDN,它們應該由Visual Studio 2010支持。您還需要一個類型特徵來從矢量中提取value_type。

template<typename T> 
struct value_type { typedef T::value_type type; }; 

template<typename F> 
auto GetListAndSearchName(F listGetter, const std::string& stringName) 
    -> typename value_type<decltype(listGetter(myList[0]))>::type 
+0

原則上這是正確的,但爲了解決VS2010對'decltype'的限制,您可能需要單獨的特徵來提取'element_type'。我相信它不喜歡用'decltype'作爲LHS運算符。 – Angew