所以我有这样的功能:
template <typename T>
bool and_map(vector<T> v, function<bool(T)> fn) { ... }
我想传递一个矢量和一个像这样的lambda函数:
[](int cell){ return(cell != -1); }
但是我收到一个错误,说明没有带有这些参数的and_map实例。
当我这样做时,它有效:
template <typename T>
bool and_map(vector<T> v, function<bool(int)> fn) { ... }
如何在不指定传递函数的参数类型的情况下使其工作?
答案 0 :(得分:4)
这是接受仿函数的正确方法:
template <typename T, typename F>
bool and_map(vector<T> v, F fn) { ... }
答案 1 :(得分:3)
将函数声明为:
template <typename T>
bool and_map(std::vector<T> v, std::function<bool(T)> fn)
编译器尝试根据两个参数推导出模板类型参数T
。但是,lambda表达式不是 std::function<T>
,因此编译器会引发错误。要解决这个问题,可以使用身份技巧使第二个参数(std::function<bool(T)>
)的上下文不可导出:
template <typename T> struct identity { using type = T; };
template <typename T>
bool and_map(std::vector<T> v, typename identity<std::function<bool(T)>>::type fn)
{
return {};
}
std::vector<int> v;
and_map(v, [](int cell){ return(cell != -1); });
这样类型T
将仅基于第一个参数推断出,然后用于定义第二个参数的类型。