一个模板元函数来检查一个类是否有一个特定的成员

通过创建一个模板元函数来检查一个类是否有一个特定的成员。以下是一个例子:

cpp 复制代码
#include <type_traits>

template<typename T, typename = void>
struct has_type_member : std::false_type {};

template<typename T>
struct has_type_member<T,
std::void_t<typename T::type>> : std::true_type {};

struct Test {
    using type = double;
};

int main() {
    static_assert(has_type_member<Test>::value, "Test::type exists");
    static_assert(!has_type_member<int>::value, "int::type doesn't exist");
    return 0;
}

在这个例子中,has_type_member 是一个模板元函数,它检查其模板参数 T 是否有一个名为 type 的成员。它首先假设 T 没有 type 成员,然后通过模板特化来检查 T 是否真的有 type 成员。

如果 T::type 存在,那么 std::void_t<typename T::type> 就是 void,所以 has_type_member<T, std::void_t<typename T::type>> 就是 has_type_member<T, void>,这匹配了模板特化,所以 has_type_member<T>::value 是 true。

如果 T::type 不存在,那么 std::void_t<typename T::type> 就会导致一个编译错误,但是由于模板参数的 SFINAE(Substitution Failure Is Not An Error)特性,这个错误会被忽略,然后编译器就会选择 has_type_member<T, void> 的主模板,所以 has_type_member<T>::value 是 false。

所以,你可以使用 has_type_member<T>::value 来检查一个类型 T 是否有一个 type 成员。

扩展:

SFINAE 是 "Substitution Failure Is Not An Error" 的缩写,它是 C++ 模板元编程中的一个重要概念。

在模板实例化过程中,编译器会尝试用具体的类型替换模板参数。这个替换过程有时可能会失败,例如当我们尝试调用一个不存在的函数或访问一个不存在的成员。在大多数情况下,这种替换失败将导致编译错误。但在某些情况下,C++ 标准允许这种替换失败,并且不会产生编译错误,这就是 SFINAE 的原理。

相关推荐
2401_8858850415 分钟前
国际语音C#接口怎么写?.NET环境下实现国际语音验证码批量下发
开发语言·c#·.net
程序猿乐锅34 分钟前
【从0-1学习Python | 第七篇】Python 面向对象基础
开发语言·笔记·后端·python·学习·1024程序员节
Wang's Blog36 分钟前
Java 项目实战: 交友项目 - 查询圈子个人动态:查询我的动态需求分析
java·开发语言·交友
凯瑟琳.奥古斯特1 小时前
力扣1016高效解法:剪枝优化技巧
开发语言·c++·算法·leetcode·职场和发展
xiangyun611 小时前
C++ priority_queue 底层:手撕二叉堆与 Top K 问题
c++·算法·面试·stl·1024程序员节
坤坤子吖2 小时前
C++继承:友元、静态成员、多继承与组合
开发语言·c++·笔记·学习·1024程序员节
技术小甜甜2 小时前
【Cursor】Skill 被标黄色警告,怎么改成合格的 SKILL.md
开发语言·javascript·ai编程·cursor·1024程序员节·ai agent·skills
qz_Serene2 小时前
练习算法题:双指针 -cpp
c++·算法·leetcode·1024程序员节
扶尔魔ocy2 小时前
【C++开发】从裸指针到智能指针
c++·智能指针·1024程序员节
小小龙学IT2 小时前
Python Polars 高性能数据处理引擎深度解析
开发语言·python·rust·1024程序员节