功能对象,它'我第一次看到它们,只是找到了一个关于它的例子以及它是如何工作的
//function object example
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
//simple function object that prints the passed argument
class PrintSomething
{
public:
void operator() (int elem) const
{
cout<<elem<<' ';
}
}
;
int main()
{
vector<int> vec;
//insert elements from 1 to 10
for(int i=1; i<=10; ++i)
vec.push_back(i);
//print all elements
for_each (vec.begin(), vec.end(), //range
PrintSomething()); //operation
cout<<endl;
}
输出:0 1 2 3 4 5 6 7 8 9
老实说,我理解了函数对象的语法,但这个例子并没有给我一个严重的问题来使用这个技术, 所以我的问题是当我应该使用函数对象?
并且我意外地找到了unary_function
,我发现了一个关于它的示例(unary_function
),示例看起来相同:
// unary_function example
#include <iostream>
#include <functional>
using namespace std;
struct IsOdd : public unary_function<int,bool> {
bool operator() (int number) {return (number%2==1);}
};
int main () {
IsOdd IsOdd_object;
IsOdd::argument_type input;
IsOdd::result_type result;
cout << "Please enter a number: ";
cin >> input;
result = IsOdd_object (input);
cout << "Number " << input << " is " << (result?"odd":"even") << ".\n";
return 0;
}
outputs :
Please enter a number: 2
Number 2 is even.
这是否意味着unary_function
是 模板 具有特定参数编号的函数对象?
我可以定义自己的函数对象,或者在我的类中使用unary_function
。
谢谢!
答案 0 :(得分:1)
unary_function
是一个帮助器模板,仅用于公开有关可调用类的类型信息。一些pre-C ++ 11功能结构(如绑定和组合)使用它 - 您只能绑定和组合匹配类型,这些类型是通过unary_function
和binary_function
基类typedef确定的。
在C ++ 11中,这已经过时了,因为可变参数模板提供了更通用的通用方法,并且使用新的std::function
和std::bind
,您可以执行C +之前可以执行的所有操作+11那些繁琐的结构以及更多,更多,更多。
答案 1 :(得分:0)
实际上,unary_function甚至不是函数对象,因为它没有声明的operator()。它仅用于简化参数和结果类型的typedef。我认为你的程序中不需要它。
当你需要一个函数时,你应该使用函数对象,这个函数不仅需要传递给函数的数据,还需要在调用函数之前存储的一些数据。