首页 > 其他分享 >一个模板元函数来检查一个类是否有一个特定的成员

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

时间:2024-05-25 19:04:15浏览次数:17  
标签:std 函数 一个 成员 value member type 模板

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

#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>::valuetrue

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

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

扩展:

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

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

标签:std,函数,一个,成员,value,member,type,模板
From: https://blog.csdn.net/niu91/article/details/139168662

相关文章

  • 因为喜欢写日记,我做了一个跨平台的本地日记APP
    项目由来年少时,对未来总是充满幻想,不时陷入沉思(上课经常溜号)。我时常会想:假如未来的我,回望过去,渴望了解我年少时的心路历程,想要知道我曾经想过什么、做过什么,有什么办法?时光机?不现实。写日记?尚可。于是乎,日记一本又一本,不仅记录了初、高中时期的点点滴滴,还承载了我的青春年华......
  • Python一个简单的单元测试
    Python一个简单的单元测试提示:以下内容均为个人原创!文章目录Python一个简单的单元测试一、介绍二、使用1.创建逻辑代码2.生成单元测试3.生成单元测试的方式(1).直接在逻辑代码中添加(2).单独制作4.运行代码总结一、介绍在使用Python制作模块后,总是不确定模块中......
  • WPF一个简单的属性编辑控件
    代码:publicclassPropertiesControl:Grid{[TypeConverter(typeof(LengthConverter))]publicdoubleRowHeight{get{return(double)GetValue(RowHeightProperty);}set{SetValue(RowHeightProperty,......
  • 『C++初阶』第四章--- 模板初级
    1.泛型编程    如何实现一个适合于所有类型的通用的交换函数呢?voidSwap(int&left,int&right){inttemp=left;left=right;right=temp;}voidSwap(double&left,double&right){doubletemp=left;left=right;right=temp;}voidSwap(ch......
  • 六.函数
    函数一.格式格式:def函数名(参数1,参数2...)代码:defqh(a,b): returna+bprint(qh(2,3))#输出:5二.递归1.自己调用自己2.有边界(结束条件)代码:defqh(a):ifa==1:return1returna+qh(a-1)n=int(input())#n==10print(qh(n))三.递归过程......
  • 使用@ConfigurationProperties注解产生的一个小错误
    今天在写项目时碰到一个错误:Notregisteredvia@EnableConfigurationProperties,markedasSpringcomponent,orscannedvia@ConfigurationPropertiesScan原代码如下:@Data@ConfigurationProperties(prefix="catshop.auth")publicclassAuthProperties{//相关......
  • C++基础知识学习笔记(5)——函数
    学习参考:https://www.bilibili.com/video/BV1et411b73Z?p=95&spm_id_from=pageDriver&vd_source=cc561849591f6a210152150b2493f6f3函数函数的默认参数可以为形参提供默认值。intadd(inta,intb=1,intc=2){ returna+b+c;}intmain(){ cout<<(add(1,3,......
  • 函数和数组的混合使用例子
    目录写两个函数,分别求两个数的最大公约数和最小公倍数写一个函数,使一个3x3的整形二维数组转置(行列转换)写一个函数打印杨辉三角扫雷游戏学习完了函数和数组,我们来进行简单的应用吧~写两个函数,分别求两个数的最大公约数和最小公倍数   一般我们求最大公约数可以使用......
  • C语言中的函数(2)
    目录前言函数的调用和声明函数的嵌套调用 函数的链式访问函数的递归调用递归求n的阶乘递归计算斐波那契数static和extern作用域和生命周期变量存储方式作用static修饰局部变量extern的使用static修饰全局变量static修饰函数函数的要求      内聚性强......
  • 数据库函数下拉式求和
    问题:如何用Dsum实现单条件求和的下拉函数解决:=DSUM($C$1:$E$9,D$1,$K$1:$K2)-SUM(L$1:L1)Dsum公式在第2行实现的是股票名称为A的求和结果;到第3行时变成股票名称为A和B的求和结果,这时需要减掉上一个单元格的数据;到第4行则需要减掉上两个单元格求和的数据。使用Sum(L$1:L1)......