初识模板特化

题目描述

我们通过这道题来学习一下“模板特化”,这是 C++ 模板元编程的基础。

模板特化是在模板的实例化过程中增加一些特例。比如我想编写一个定长 N 的数组类,它长成这样:

tempate<typename T>
class Array {
    T data[N];
};

也就是简单地包装 C 数组。但是对于 Array<bool> 这个类,我希望让用一个比特而非一个字节来代表元素,也就是写成这样:

template<>
class Array<bool> {
    bool data[N / 8]; // 每个字节 8 个比特
};

这样,就可以对 Array<bool> 这种情形节约内存使用。

上面的代码就声明了一份模板特化。我们目前这种写法叫做类模板的全特化,它由 template <> 开头,然后后面跟着普通的类声明。但是,类名要写成 模板名<要特化的模板实参列表> 这个样子,比如这里的 Array<bool>

下面,请运用这种手法,实现一个 IsInt<T> 类型——它的静态常量成员 value 当且仅当 Tint 时才为 true

注:静态常量成员可以像下面的代码那样,直接在类内定义(非常量的话不一定可以)。

关于输入

关于输出

见样例输出

参考答案

#include <iostream>

template <typename T>
struct IsInt {
    constexpr static bool value{false};
};

template <>
struct IsInt<int> {
    constexpr static bool value{true};
};

int main() {
    IsInt<int> obj1;
    IsInt<double> obj2;
    std::cout << std::boolalpha << obj1.value << " " << obj2.value << std::endl;

    using AlsoInt = int;
    std::cout << IsInt<AlsoInt>::value << " " << IsInt<bool>::value << std::endl;
}