由于函数对象有四种写法,所以对应的,函数传递也有对应的四种传递方案
c风格函数指针(普通函数)
通过函数对象的指针传递
//主函数
template<class T>
void traverse(void (*visit)(T&))
{....}
// 要传递的函数
template<class T>
void print(T& e){ cout <<e<<" " ;}
//使用
traverse(print);
operator()(仿函数)
使用函数对象的引用传递
//主函数
template<class VST>
void traverse(VST& visit)
{.......}
//要传递的函数
template<class T>
struct Print
{
void operator()(T&e){cout <<e<<" ";}
}
//使用
Print<int> print; //先将函数类实例化,注意,模版类需要<> 参数才可以实例化!
traverse(print);
Lambda表达式
// 主函数,可以看出没有用到模版数据类型T,使用函数对象传递
template<class VST>
void traverse(VST& visit)
{.......}
//要传递的函数
template<class T>
auto print = [](T& a){ cout <<a <<" ";};
// 使用
traverse(print<int>) // 指出具体的类型,模版类需要<> 参数才可以实例化!
std::function
std::function 本质是一个万能函数类。
// 主函数,可以看出没有用到模版数据类型T,使用函数对象传递
template<class VST>
void traverse(VST& visit)
{.......}
//要传递的函数,可以是以上任意一种写法
//例如
template<class T>
void Print(T& e){ cout <<e<<" " ;}
//而后将这个c风格函数对象转成万能对象,注意万能对象最好是具体化的,非模版的,当然写成模版也没问题
template<class T>
std::function<void(T&)> print;
print<int> = Print<int>;
//使用
traverse(print<int>)