/*
*Traits技术以一个统一的编程接口描述各种数据类型的基本特征.
*
*例如float 的最大值为 2^128, 在float.h 中被定义为FLT_MAX_EXP
* double 的最大值为 2^1024,被定义为DBL_MAX_EXP.
* 此外, float 和double 的最小值也不同, 分别定义为
* FLT_EPSILON 和DBL_EPSILON
*
* 设想要设计一个数值分析库, 待处理的数值可表示为float, double
* 或long double.
* 为了避免在多个地方查询数值类型,
* 使用traits 技术可以将不同的数据类型封装在一个类模版中
* 程序其他模块可以使用这个类模版接口获得每个数据类型的信息
*/
#include
using namespace std;
//此模版类为一个同统一的接口来提供数据类型的信息
template
struct fp_traits{};
template<>
struct fp_traits
{
typedef float fp_type;
enum{max_exponent = FLT_MAX_EXP};
static inline fp_type epsilon()
{
return FLT_EPSILON;
}
};
template<>
struct fp_traits
{
typedef double fp_type;
enum{max_exponent = DBL_MAX_EXP};
static inline fp_type epsilon()
{
return DBL_EPSILON;
}
};
template
class matrix { public: typedef numT num_type; typedef fp_traits
num_type_info; inline num_type epsilon() { return num_type_info::epsilon(); } }; int main() { std::ios::sync_with_stdio(false); matrix
fm; matrix
dm; cout << "float matrix " << fm.epsilon() << endl; cout << "double matrix " << dm.epsilon() << endl; return 0; }
Traits技术
最新推荐文章于 2021-02-16 09:54:53 发布