可以在运行时使用RTTI识别数据类型,但是我们如何在编译时执行
decltype
在编译时获得底层类型。该标准定义了许多实用程序,称为trait,用于对类型进行检查。
-
大部分型性状出现在
<type_traits>
-
许多算术型性状位于
<limits>
。将这些特性与if constexpr
结合起来,可以实现编译时分支。一个基本的例子:
template<typename T>
void fun(T object) {
if constexpr (std::is_same_v<decltype(object), std::string>) {
std::cout << '"' << object << ""n";
}
if constexpr (std::is_unsigned_v<decltype(object)>) {
std::cout << "unsignedn";
}
else if constexpr (std::is_pointer_v<decltype(object)>) {
std::cout << *object << 'n';
}
else if constexpr (std::is_base_of_v<foo, decltype(object)>) {
std::cout << "derived from foon";
}
}
c++支持模板元编程。元编程意味着编译时编程,我们可以使用类型而不是值。这主要是通过模板专门化
实现的例如,下面的代码可用于查询类型,例如,确定特定类型是否为指针。所有这些都发生在编译时
template<class T>
struct isPointer{
static bool value = false;
}
template<class T> // Template specialization
struct isPointer<T*>{
static bool value = true;
}