我们经常在看到这样的函数声明:int f(double,MyClass=MyClass());不仅是我们写的代码,std库中也经常这样写。仔细想想,如果这个函数多次使用这个缺省值那就会调用多次构造函数,这样一来效率就降低了。下面是我针对,这中情况写的一个Zero模板。Zero只有一个可用的接口就是value,value()会返回默认值。其中还对基本数值类型进行了特别优化,这样只是为了全面,如果直接用0也是一样的。这个东西的缺点是不能提供自己的值,只能用T()。主要原因是因为template使用的 引用或指针只能用全局对象。如果有全局对象那还不如直接用那对象哪。
下面我的Zero.hpp文件内容: #ifndef ZERO_PIBOYE_HPP#define ZERO_PIBOYE_HPP//Author:piboye//Created Date: 2005,12,29
namespace piboye{ template <typename T> class Zero { private: static T const c_value; public: static inline T const & value() {return c_value;} }; template <typename T> T const Zero<T>::c_value=T();
//辅助特化宏 #define MSpecZero(T,val) / template <> / class Zero<T> / {/ public: / static inline T value() {return val;}/ };//基本类型特化 MSpecZero(int,0) MSpecZero(short,0) MSpecZero(long,0) MSpecZero(char,0) MSpecZero(unsigned int,0) MSpecZero(unsigned short,0) MSpecZero(unsigned long,0) MSpecZero(unsigned char,0) MSpecZero(float,0.0f) MSpecZero(double,0.0) MSpecZero(long double,0.0l)}#endif //ZERO_PIBOYE_HPP
使用方法:int f(double,MyClass=Zero<MyClass>::value());