这是C++11新特性介绍的第八部分,涉及到template相关的新特性。
不想看的读者可以直接拉到文章最后看这部分的总结。
function
C++提供了很多种可调用对象,例如函数指针、lambda、重载了operator()的对象等。有时我们需要将这些对象统一管理,这时使用如下这种方式是不行的:
int add(int i, int j) { return i + j; }
struct divide
{
int operator()(int i, int j)
{
return i / j;
}
};
std::map<std::string, int(*)(int, int)>> binops = {
{"+", add},
{"-", std::minus<int>()},
{"*", [](int i, int j) {return i * j; }},
{"/", divide()},
};
无法直接将binops中的可调用对象直接转换成int(*)(int, int)。
C++11新标准中提供了一个名为function的标准库类,可以用function来表示以上所有的函数调用,只要这些函数调用的参数类型和返回类型是一致的。
std::cout<<"test function<T>:\n";
std::map<std::string, std::function<int(int, int)>> binops = {
{"+", add},
{"-", std::minus<int>()},
{"*", [](int i, int j) {return i * j; }},
{"/", divide()},
};
std::cout<<"+:\t"<<binops["+"](1, 2)<<"\n";
std::cout<