初识模板特化
题目描述
我们通过这道题来学习一下“模板特化”,这是 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
当且仅当 T
是 int
时才为 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;
}