gpt4 book ai didi

c++ - 如何在 C++ 中创建自适应仿函数?

转载 作者:行者123 更新时间:2023-11-28 02:22:00 24 4
gpt4 key购买 nike

我必须创建一个接受 2 个整数参数的仿函数,但只使用第一个。我将使用 std::bind2nd 将第二个参数设置为等于 2。但我无法编译它。

我理解问题是编译器无法在构造函数和二元函数之间做出选择(我是对的?)。但我不知道如何解决它。

#include <iostream>
#include <functional>
#include <algorithm>

class gt_n : public std::binary_function<int, int, bool>
{
int val;
public:
gt_n(int v) : val(v) {}
bool operator()(int first, int)
{
return first > val;
}
};

int main()
{
int a[] = { 1, 2, 3 };
int sz = sizeof a / sizeof a[0];
gt_n f(2);
std::cout << std::count_if(a, a + sz,
std::bind2nd(f(), 2)) << std::endl;

return 0;
}

编译器信息:

main.cpp: In function 'int main()':
main.cpp:22:18: error: no match for call to '(gt_n) ()'
std::bind2nd(f(), 2)) << std::endl;
^
main.cpp:5:7: note: candidate is:
class gt_n : public std::binary_function<int, int, bool>
^
main.cpp:10:7: note: bool gt_n::operator()(int, int)
bool operator()(int first, int)
^
main.cpp:10:7: note: candidate expects 2 arguments, 0 provided

最佳答案

您已经在 gt_n f(2); 行中创建了仿函数(通过构造函数)。如果将 f() 传递给 std::bind2nd,您将尝试调用不存在的 operator()()。只需传递仿函数 (f):std::bind2nd(f, 2))

两个附加说明:

  • 正如评论中所指出的,std::bind2nd 已被弃用。您应该使用 std::bind。在 C++11 中,std::binary_functionstd::unary_function 也被弃用。您不再需要扩展它们。
  • std::count_if 不需要二元谓词,而是一元谓词。 operator() 应该只有一个参数。

关于c++ - 如何在 C++ 中创建自适应仿函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32073883/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com