和函数求值类似,当模版的形参被实参替换时,模版会进行编译器计算。由于模版支持类型参数和非类型参数,故支持两种计算

    • 类型参数:类型计算
    • 非类型参数:数值计算

    模版的实参在编译器传入,计算结果由模版内部定义的enumstatic const的整形对象保存! C++这种编译期计算支持的计算对象只能是整形常量和类型

    1. class SourceFile
    2. {
    3. public:
    4. //隐式类型转换+模板函数参数推导-->自动推导出N
    5. template<int N>
    6. SourceFile(const char (&arr)[N])
    7. : data_(arr),
    8. size_(N-1)
    9. {
    10. const char* slash = strrchr(data_, '/'); // builtin function
    11. if (slash)
    12. {
    13. data_ = slash + 1;
    14. size_ -= static_cast<int>(data_ - arr);
    15. }
    16. }
    17. explicit SourceFile(const char* filename)
    18. : data_(filename)
    19. {
    20. const char* slash = strrchr(filename, '/');
    21. if (slash)
    22. {
    23. data_ = slash + 1;
    24. }
    25. size_ = static_cast<int>(strlen(data_));
    26. }
    27. const char* data_;
    28. int size_;
    29. };