使用模板元编程技术编写程序时,经常需要查询类型的一些特性信息。C++11引入了<type_traits>头文件,提供了一些对类型特性检查的支持,比如is_integral、is_pointer等等。但是,在用一些过时或者没有实现完整的编译器上,这些特性可能会出现问题。本文将介绍从Boost库中获取一个类型的underlying_type是否有效的例子,帮助我们解决这样的问题。
在C++11之前,如果一个枚举类型需要与其它类型进行转换,当然需要使用类型转换操作符或者强制类型转换。但是在C++11之后,可以使用underlying_type特性来获取枚举类型的底层存储类型。这样可以避免直接使用强制类型转换时的错误,因为在一些情况下,底层存储类型并不是明显的整型类型。
为了实现这个underlying_type特性的检查程序,我们可以使用Boost库中的is_detected模板类。它可以用于检测是否存在一个符合某种要求的成员类型。
具体方法是:定义一个调用要检查成员类型的函数模板,该函数模板以一个模板参数(某种待检测的类型)作为参数。然后使用is_detected模板类来检测此函数是否可以被编译器“正常”调用,也就是能否调用成功,如果成功,则说明该待检测类型有符合要求的成员类型。
下面是一个例子,使用Boost库的is_detected模板类来判断一个类型T是否具有underlying_type成员类型:
#include <type_traits>
#include <boost/type_traits.hpp>
template<typename T>
using und
本文介绍了在C++编程中如何使用Boost库的is_detected模板类来检测类型是否具有underlying_type特性,以解决在C++11标准之前和不完整实现的编译器上遇到的问题。通过示例代码展示了如何定义和测试这个特性检查程序,以确保正确获取枚举类型的底层存储类型。
订阅专栏 解锁全文

被折叠的 条评论
为什么被折叠?



