首页 > 其他分享 >std::declval 元函数

std::declval 元函数

时间:2024-01-20 18:22:48浏览次数:17  
标签:std __ 函数 declval int template 求值

declval用于非求值上下文中
declval 原形:

template<typename _Tp>
  auto declval() noexcept -> decltype(__declval<_Tp>(0))
  {
    static_assert(__declval_protector<_Tp>::__stop,
	    "declval() must not be used!");
    return __declval<_Tp>(0);
  }
.....
template<typename _Tp>
  struct __declval_protector
  {
    static const bool __stop = false;
  };
....
template<typename _Tp, typename _Up = _Tp&&>
  _Up
  __declval(int);

template<typename _Tp>
  _Tp
  __declval(long);
  • __declval只有声明,没有定义;所以说用于求值上下文中会在链接时报错
    所以上面用了静态断言以提供更友好的错误信息;
  • __declval_protector 延迟实例化时机 用于防止无条件编译错误
  • 而在非求值上下文中使用时,不会对函数体内的语句进行检查,即不会执行静态断言,据此约束了使用场景;
  • ! 利用了函数返回值的特性, 对于__declval你传什么类型就返回什么类型的"实体", 注意:这种实例化并不是真正的在内存上构造出对象, 它在编译期非求值上下文中,仅仅是用于构造合法的语句

用法1:求函数返回类型:

void commonF(int,double,char){};

template<class F,class... Args>//F:可调用对象 类型; Args:F的参数类型
  using InvokeResultOfFunc =
  decltype(declval<F>()(declval<Args>()...));
  
int main(){
//不仅可以用于普通函数, 还可用于函数对象的求返回类型
   InvokeResultOfFunc<float (int), int> a{};//a为int类型
   InvokeResultOfFunc<decltype(commonF), int,double,char> *b{};
}

标签:std,__,函数,declval,int,template,求值
From: https://www.cnblogs.com/ComputerTech/p/17976690

相关文章

  • Python中的回调函数
    先来看一个程序:deff1():print(2)return1deff2(a):print(3)returnaprint(f2(f1()))这个程序,在调用时,f2会先等待f1调用完毕,返回1之后,再进行调用,所以会输出2、3、1,但是若这样改写程序deff1():print(2)return1deff2(f):prin......
  • 日期函数——来源网络,方便查阅
    DateUtils时间单元,非常有用。记得引用这个单元,不然不能用。CompareDate比较两个日期时间值日期部分的大小CompareDateTime比较两个日期时间值的大小CompareTime比较两个日期时间值时间部分的大小DateOf去除日期时间值的时间部分DateTimeToJulianDate转换日期时间值为儒略日......
  • 积性函数学习笔记
    积性函数定义积性函数:\(f(x)\)满足\(\forall\gcd(a,b)=1,f(ab)=f(a)f(b)\)若没有\(\gcd(a,b)=1\)的性质,则为完全积性函数。性质性质1:\(f(x),g(x)\)是积性函数\(\implies\)\(f\timesg\)是积性函数,\(f\divg\)是积性函数证明略。性质2:狄利克雷(Dirichlet)卷积\(......
  • MySQL中的加密函数
    本文简单介绍MySQL中的加密函数。MySQL提供了多种加密函数,以下是一些常用的:PASSWORD(str):用于密码加密,通常用于创建用户时对密码进行加密。MD5(str):生成一个128位的加密串,返回一个32位的16进制数。SHA1(str):生成一个160位的加密串,返回一个40位的16进制数。ENCODE(str......
  • c++函数默认参数及占位参数
    一.函数默认参数在c++中,函数形参列表中的形参是可以有默认值的语法:如果我们自己传入数据,就用自己的数据,如果没有,就用默认值注意:1.如果某个位置参数有默认值,那么从这个位置往后,从左往右,必须都要有默认值2.如果函数声明有默认值,函数实现的时候就不能有默认参数。(声明和实现只......
  • 细说JavaScript函数(JavaScript函数详解)
    函数的作用就是封装一段JavaScript代码,让开发者可以通古简单的方式使用这段代码![细说JavaScript函数(JavaScript函数详解)](https://img-blog.csdnimg.cn/direct/9f5c340fdb0d4540a3bcb8e5e251e96b.png)一、函数的分类在几乎所有的编程语言中,都有函数这一概念,并且没中语言本身......
  • JavaScript保留字和预定义的全局变量及函数汇总
    保留字也称关键字,每种语言中都有该语言本身规定的一些关键字,这些关键字都是该语言的语法实现基础,JavaScript中规定了一些标识符作为现行版本的关键字或者将来版本中可能会用到的关键字,所以当我们定义标识符时就不能使用这些关键字了,下面介绍下JavaScript保留字和预定义的全局变量......
  • 详解匿名函数递归:从此能看懂天书代码
    最近在读《左耳听风》,里面提到了一个匿名函数递归的例子,觉得很有趣,但是我觉得书里讲解的还是有点难懂,所以尝试用自己的理解把这个问题重新讲了一遍。注:本文中所用的代码示例会同时使用JavaScript,Python语言。让我们先来看下面这段代码://javascript(f=>f(f))(f=>n=>n==......
  • C++中对象作为函数参数进行传参
    在C++语言环境中,对象是类的一个实例。 有三种方式:1、直接使用对象作为函数参数,形参和实参是不同的对象,它们所占地址空间不同,因此形参的改变并不影响实参的值。2、传入指向对象的指针作为函数参数,所谓“传址调用”,就是在函数调用时使用实参对象的地址,形参和实参都指向同一个地......
  • hive window 开窗函数
    一、窗口函数聚合函数:sum()min()max()avg()排序函数:rank()dens_rank()row_number()ntile()统计比较函数:lead()lag()first_value()二、窗口大小partitionbyorderby三、窗口边界nprecedingnfollowi......