有可能在c++编译时识别对象的数据类型吗?



可以在运行时使用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;
}

最新更新