2016-11-18 139 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