C++ 可调用对象与function模板

可调用对象

可调用对象的概念:

可调用对象是指可以像函数一样被调用的实体,C++中常见的可调用对象如下

1,函数指针

int func(int x) // 同下面的重载函数原型一样
{
    cout << x << endl;
    return x;
}

int (*pf)(int) = func; // pf是函数指针
pf(10) // 调用函数指针

 2,函数对象, 函数对象是一个类对象,它重载了函数调用运算符operator(), 使得对象可以像函数一样被调用

class Num
{
private:
	int x;
public:
	Num(int i = 0) { x = i; cout << "执行构造函数" << endl; }
	int operator()(int value) const
	{
		if (value < 0) return 0;
		return value;
	}
};

 案例演示

Num num_1 // 创建一个含有函数调用运算符的对象
int res = num_1(100) // 像函数调用一样使用对象, 等价于num_1.operator()(1oo);

Num num_2(100) // 调用构造函数,请注意区别构造函数的形式, 这是对象的定义并且初始化
num_2(200) // 这才是调用对象的重载()函数

 使用可调用对象

map My_pf; // 使用map存储可调用对象

My_Pf.insert( {"func", pf} ); // 成功插入函数指针
My_pf.insert( {"Num", num_1} ); // 插入失败,系统不认为对象num_1是一个函数指针

在这里第二项插入失败,所以需要用到std::function函数

function模板:

function类模板:可以提供参数来表示function类型能够表示的“对象调用形式”,是C++11中的类模板,用于封装可调用对象(函数, 函数指针, 成员函数指针, lamba表达式等)

function // 这声明了一个function类型, 用来代表一个可以调用的对象,他所代表的这个可以调用对象是:接受一个int返回一个int的类型
function< int(int) > f1 = pf;
function< int(int) > f2 = num_1;

现在可以将map生成如下形式
map> My_Pf;
现在可以插入数据了

你可能感兴趣的:(c++,primer,plus,c++)