在C ++ 11中传递带有未指定参数的函数?

时间:2014-11-13 22:17:53

标签: c++ c++11 lambda

所以我有这样的功能:

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) { ... }

如何在不指定传递函数的参数类型的情况下使其工作?

2 个答案:

答案 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将仅基于第一个参数推断出,然后用于定义第二个参数的类型。

DEMO