函数模板中使用类型萃取(traits)替换类型推导(deduce)
2011-05-27 07:57
302 查看
以max函数为例,通常是以宏的形式出现的
#define max(a, b) (((a) > (b)) ? (a) : (b))
但是在C++中,我们可能用模板替换它(对于内建类型,我们可以不写const&)
template<typename T>
T const& max(T const& a, T const& b)
{
return (a > b ? a : b);
}
当然我们可能提供两个模板参数,但这里我们演示的是只提供一个模板参数的解决方法
很多时间我们会使用0的情况,于是下面的使用将导致编译失败,原因是编译器推导出double和int两种类型,而模板参数只有一个T,岐义
double m = max(1.0, 0);
同理,对于所有可隐式转换的类型(如内建类型int, char, short, __int64,float, double等),都不能调用max函数
解决的一个办法是,我们使用类型萃取的方法实现,如下
template<typename T>
T const& max(T const& a, typename std::iterator_traits<T*>::value_type const& b)
{
return (a > b ? a : b);
}
这时上面的调用便正确了
double m = max(1.0, 0);
反之亦然
double m = max(0, 1.0);
扩展:
对于函数中用户可能传指针NULL时,类型推导都会失败,这时如果用户不想在调用函数时进行强制转换的话,那么程序员在实现就可以采取类型萃取的方式,这时便能剔除掉将NULL推导出int类型的困扰了。
当然有望C++0x解决nullptr的问题。
#define max(a, b) (((a) > (b)) ? (a) : (b))
但是在C++中,我们可能用模板替换它(对于内建类型,我们可以不写const&)
template<typename T>
T const& max(T const& a, T const& b)
{
return (a > b ? a : b);
}
当然我们可能提供两个模板参数,但这里我们演示的是只提供一个模板参数的解决方法
很多时间我们会使用0的情况,于是下面的使用将导致编译失败,原因是编译器推导出double和int两种类型,而模板参数只有一个T,岐义
double m = max(1.0, 0);
同理,对于所有可隐式转换的类型(如内建类型int, char, short, __int64,float, double等),都不能调用max函数
解决的一个办法是,我们使用类型萃取的方法实现,如下
template<typename T>
T const& max(T const& a, typename std::iterator_traits<T*>::value_type const& b)
{
return (a > b ? a : b);
}
这时上面的调用便正确了
double m = max(1.0, 0);
反之亦然
double m = max(0, 1.0);
扩展:
对于函数中用户可能传指针NULL时,类型推导都会失败,这时如果用户不想在调用函数时进行强制转换的话,那么程序员在实现就可以采取类型萃取的方式,这时便能剔除掉将NULL推导出int类型的困扰了。
当然有望C++0x解决nullptr的问题。
相关文章推荐
- 利用类型萃取(Traits)限制函数模版具体化所使用的类型
- 使用boost::enable_if与boost::type_traits在模板中实现对模板类型的接口的限制
- Linux批量替换某种类型文件中的字符串-sed和grep命令使用
- 图说函数模板右值引用参数(T&&)类型推导规则(C++11)
- ibatis.net:尽可能的使用匿名类型替换 Hashtable
- 第17课 类型萃取(1)_基本的type_traits
- 第18课 类型萃取(2)_获取返回值类型的traits
- Item 6: 当auto推导出一个不想要的类型时,使用显式类型初始化的语法
- C++ 中Traits技术 (4) —— 类型推导
- Item 47: 请使用traits class表现类型信息
- 第19课 类型萃取(3)_类型选择的traits
- C++类型萃取之type_traits和type_info
- C++ 模板类型萃取技术 traits
- [C++]高效使用c++11--理解auto类型推导
- error C2027: 使用了未定义类型 std::basic_ifstream<_Elem,_Traits>
- JavaScript的String类型replace()方法介绍和使用replace()方法实现简单html模板替换功能
- 【STL】类型萃取(TypeTraits)
- 读书笔记 effective c++ Item 47 使用traits class表示类型信息
- Item 47:使用Traits类提供类型信息
- java中的一些string类型使用,如替换指定的字符串。