标签:这一 turn 参数化 需要 return 解决 缺点 不可 大小
例如有一个 min 函数,我们希望它相对类型是独立的,也就是说任何类/类型都可以调用这个函数。如果是一个整型的数,通常我们可以这样写:
int min(const int & a,const int &b)
{
return a<b?a:b;
}
为了让它适用于多个类,我们知道C++有函数模板机制,那么就可以写成下面的形式:
template <typename T>
const & T min(const T& a,const T &b)//这里的返回值为 const &,这需要参数中也有 const & 或者有指针
{
return a<b?a:b;
}
但是T类很可能没有重载<
符号,这样就不泛型了,因为你总不可能要求别人或者你自己去一个个地把这些类的操作符都重载了。还有一个问题是有时候小于符号提供的功能,但不是我们想要的,例如我们想要比较字符,但是不区分大小写,但是字符的小于却是区分大小写的。
针对这种问题,常见的解决方案是参数化操作符,其中又可分两种,一种是传函数指针,一种是传函数对象。如果你感到陌生,看了下面两个例子应该会明白:
template<typename Type,
bool (*Comp)(const Type&,const Type&)>
const Type &
min(const Type& a,const Type& b)
{
if(Comp(a,b)) return a;
else return b;
}
函数指针的缺点,是其间接引用导致不能内联,使用函数对象可以解决这一问题。
template<typename Type,
typename Comp>
const Type &
min(const Type& a,const Type& b,Comp comp)
{
if(comp(a,b)//这里要求类重载了()操作符。
return a;
else
return b;
}
接下来马上又要问的问题是,函数对象从哪里来?一般来说有三种来源,预定义函数对象,预定义函数适配器和自己定义的函数对象。
预定义函数对象被分为算术关系和逻辑操作,通过引用 functional 可以调用其中的类模板
#include <functional>
标签:这一 turn 参数化 需要 return 解决 缺点 不可 大小
原文地址:https://www.cnblogs.com/drunknbeard/p/10249122.html