无法推导 lambda 函数模板参数

mti*_*ijn 2 c++ visual-studio-2012

我在源文件中本地声明了这个模板函数:

template<typename T>
const std::wstring test(std::function<const std::wstring(T)> f, T arg)
{
    return f(arg);
}
Run Code Online (Sandbox Code Playgroud)

我尝试在后续函数中使用它,如下所示:

auto run = [](const std::string address) -> const std::wstring { return L""; };
test(run, address);
Run Code Online (Sandbox Code Playgroud)

但编译器抱怨它无法推导出 lambda“run”的模板参数。我究竟做错了什么?

编译器说:

error C2784: 'const std::wstring test(std::function<const std::wstring(T)>,T)' : could not deduce template argument for 'std::function<const std::wstring(T)>' from 'xxx::<lambda_d434160cf17ec6991f6c12a43474f9a9>'
Run Code Online (Sandbox Code Playgroud)

iav*_*avr 5

你需要

std::function<const std::wstring(std::string)> run =
    [](const std::string address) { return L""; };
Run Code Online (Sandbox Code Playgroud)

lambda 有自己的生成类型(xxx::<lambda_d434160cf17ec6991f6c12a43474f9a9>在您的情况下),并且 with auto,run保留此类型。另一方面,test期望std::function<const std::wstring(T)>.

test更简单(也更高效),您可以在函数类型上创建一个模板:

template<typename F, typename T>
const std::wstring test(F f, T arg) { return f(arg); }
Run Code Online (Sandbox Code Playgroud)

  • +1建议改进模板功能,谢谢! (2认同)