我们经常在看到这样的函数声明:
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());