首页 > 解决方案 > std::function 函数作为默认参数

问题描述

我有这个方法头:

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()函数(如果可能的话),所以我没有重复的代码。

标签: c++templates

解决方案


您需要指出alwaystrue要使用哪个实例作为默认值,即alwaystrue<E>

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

推荐阅读