从参数的返回类型推断函数的返回类型

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();
}

即使在我的函数指针的返回类型中存在U,它是模板参数F(我使用std :: mem_fn创建它,后来F也可能是std :: function),目前我需要显式地将U的类型传递给编译器。

我如何让我的旧Vs2010编译器推断出U的类型?


1
你不能这样做。返回类型本身是无法推断的。 - NathanOliver
2
我已经插入了一个特定的标准标签。我不确定在C++03中是否容易解决。 - Bathsheba
1
寻找 function_traits 函数。 - Jarod42
@101010 如果您有时间,可以将其编写为答案。即使对我没有用处,它可能是其他人的答案。 - Kadir Erdem Demir
@KadirErdemDemir:从C++11开始,您可以使用尾返回类型语法。那里会有很多重复的内容。对于这个问题,那样的回答将被投票否决。 - Bathsheba
显示剩余4条评论
2个回答

6

2010年可行的工作:

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

不错。解决了::的问题。 - Bathsheba
如果列表为空会发生什么? - Kadir Erdem Demir
1
@KadirErdemDemir 在 decltype 内部的表达式不会被计算,所以不会出现任何问题。 - n. m.

4
你需要使用decltype和尾返回类型。它们都是C++11的特性,但根据MSDN的说法,它们应该受到Visual Studio 2010的支持。你还需要一个类型特性来从vector中提取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

您IP地址为143.198.54.68,由于运营成本限制,当前对于免费用户的使用频率限制为每个IP每72小时10次对话,如需解除限制,请点击左下角设置图标按钮(手机用户先点击左上角菜单按钮)。 - Angew is no longer proud of SO

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接