和函数求值类似,当模版的形参被实参替换时,模版会进行编译器计算。由于模版支持类型参数和非类型参数,故支持两种计算
- 类型参数:类型计算
- 非类型参数:数值计算
模版的实参在编译器传入,计算结果由模版内部定义的
enum
或static const
的整形对象保存! C++这种编译期计算支持的计算对象只能是整形常量和类型
class SourceFile
{
public:
//隐式类型转换+模板函数参数推导-->自动推导出N
template<int N>
SourceFile(const char (&arr)[N])
: data_(arr),
size_(N-1)
{
const char* slash = strrchr(data_, '/'); // builtin function
if (slash)
{
data_ = slash + 1;
size_ -= static_cast<int>(data_ - arr);
}
}
explicit SourceFile(const char* filename)
: data_(filename)
{
const char* slash = strrchr(filename, '/');
if (slash)
{
data_ = slash + 1;
}
size_ = static_cast<int>(strlen(data_));
}
const char* data_;
int size_;
};