std :: function,函数作为默认参数

时间:2018-04-25 08:01:08

标签: c++ templates

我有这个方法标题:

void Find(const _T & v, int max, const function<bool(const _E &)> & filter)

我使用std::function因为我需要接受函数指针,函子或lambda表达式。我希望过滤器是可选的,并且默认为总是返回true的函数(没有过滤掉)作为默认参数。我尝试过这样的事情:

#include <functional>

template <typename E>
bool alwaystrue(const E & e){ return true; }

template <typename T, typename E>
void Find(const T & v, int max,
          const std::function<bool(const E &)> & filter = alwaystrue);

int main()
{
    Find<int, int>(1, 2);
}

但是这并没有编译:

50016981.cpp: In function ‘void Find(const T&, int, const std::function<bool(const E&)>&) [with T = int; E = int]’:
50016981.cpp:11:24: error: cannot resolve overloaded function ‘alwaystrue’ based on conversion to type ‘const std::function<bool(const int&)>&’
     Find<int, int>(1, 2);
                        ^

我也试过让我的班级内有这个功能,但也有类似的错误。

std::function与模板相结合是否存在问题?如果是这样,你能建议怎么做我想要的吗?我想避免重载Find()功能(如果可能的话),这样我就不会有重复的代码。

1 个答案:

答案 0 :(得分:2)

您需要指明要将alwaystrue用作默认值的实例,即alwaystrue<E>

template <typename T, typename E>
void Find(const T& v, int max,
          const std::function<bool(const E&)>& filter = alwaystrue<E>);