讨论C++的关键字decltype和它的功能

184 阅读3分钟

"类型推理 "是指在计算机语言中自动确定一个语句的数据类型。在C++11之前,一个表达式在运行时的可能值受到每个数据类型的手动声明的限制。如果我们能够使用类型推理,我们就可以写更少的代码来表达编译器已经理解的东西。尽管编译时间大大增加,因为所有的类型只在编译器阶段确定,但程序的执行时间不受影响。在这里,我们将讨论C++的关键字decltype和它的功能。"

什么是C++中的decltype

它看的是一个实体或表达式的声明类型。Decltype是一种考察给定表达式类型的操作符,与 "auto "相反,它允许你用某种类型定义一个变量,但允许你从该变量中检索类型。类型信息在编译时由Decltype提供,在执行时由TypeId提供。因此,如果一个派生类的对象有一个基类的引用或指针指向它,typeid将提供派生类型的引用或指针,而不是类型,后者将由Decltype提供。

当需要知道一个对象的动态类型时,运算符typeid被使用。然而,返回的实际名称在某种程度上是依赖于编译器的。

C++为decltype提供的一般语法如下。

语法

 decltype( expression )

decltype只需要一个参数,也就是一个表达式。decltype返回表达式参数的类型。使用以下准则,编译器取决于表达式参数的类型。

  • 当表达式参数是对类成员或标识符的访问时,由表达式标识的对象的类型是 decltype(expression)。如果这样的对象不存在,或者如果表达式参数指定了一组重载函数,编译器会发出错误信息。
  • 如果输入的表达式调用了一个方法或一个有许多重载的运算符函数,那么给定函数的返回类型是 decltype(expression)。

例1

上述讨论的实现是由decltype代码给出的。由于多个变量、函数、类等在相同的范围内不能有相同的名字。因此引入命名空间来解决这个问题。在这之后,我们建立了一个函数 "my_func1",它返回整数值 "5",因为我们最初为函数 "my_func1 "指定了int数据类型。

同样,我们建立了一个函数 "my_func2",并给它指定了一个char数据类型。这个函数返回字符值 "i"。接下来,我们构建了程序的int main(),在这里我们部署了decltype修改器。decltype修改器分别将 "my_func1 "和 "my_func2 "作为一个参数。在decltype中,我们还将两个变量定义为 "a "和 "b"。

变量 "a "和 "b "的数据类型与 "my_func1 "和 "my_func2 "的返回类型相同。然后,我们有一个cout语句,typeid将变量 "a "和 "b "作为输入,并将返回这些变量的类型。

#include <bits/stdc++.h>

using namespace std;

int my_func1() { return 5;}

char my_func2() { return 'l'; }

int main()
{
    decltype(my_func1()) a;
    decltype(my_func2()) b;
    cout<<typeid(a).name() <<endl;
    cout<<typeid(b).name() <<endl;
    return 0;
}

由于 "my_func1 "的类型是int,"my_func2 "是char。所以,在输出中,返回类型 "i "和 "c",表明是int和char类型。

例2

下面提供了一个额外的关于decltype使用的例子,它与之前的例子略有不同。我们在标题部分之后直接构造了这个特殊程序的main()。在程序的int main()中,我们声明了变量 "num "并给它分配了一个数字 "10"。然后,我们调用了decltype修改器,它将变量 "num "作为参数。通过decltype修改器,我们还设置了变量 "i",其类型为int,与变量 "num "的类型相同。

然后,我们通过在 "i "变量中使用加号运算符将num和数字 "10 "相加。在这之后,我们有一个调用typeid的cout命令,它将变量 "i "作为输入并提供其类型。

#include <bits/stdc++.h>

using namespace std;

int main()
{
    int num = 10;
decltype(num) i = num + 10;
cout<< "decltype : " <<typeid(i).name();
    return 0;
}

由于我们在上述代码片断中为变量 "num "提供了int类型。输出显示 "i "字,这是变量 "num "的int类型值。

例3

最小的数字是由C++模板方法min type()返回的,如下图所示。任何积分类型都可以用于这两个数字。2的最小类型被用来确定返回类型。

通过自动修改器,我们创建了函数SearchMin(),并将变量x和y作为参数传到它里面。然后,我们将变量名分配给decltype关键字。decltype将变量与条件表达式联系起来。该函数搜索最小值并返回具有最小值的变量类型。接下来,在int main()中,我们通过cout命令将值传递给SeatchMin函数。

#include <bits/stdc++.h>

using namespace std;

template
auto SearchMin(T1 x , T2 y) ->decltype(x < y ? x : y)
{
    return (x < y) ? x: y;
}
int main()
{
    cout<<SearchMin(5, 4.55) <<endl;
    cout<<SearchMin(6.5, 2) <<endl;
    return 0;
}

输出显示了下面的最小值。如从第一条SearchMin语句来看,4.55是由双倍类型返回的。然后第二条语句,2是由int数据类型得到的。

结论

这就是关于C++ decltype的全部内容。在这篇文章中,我们已经简要地讨论了它的定义、语法和它的功能。在这里,我们已经用C++中的运行示例代码展示了decltype的工作。所有的实例都是相互独立的。这些实例都彼此不同。在最后一个例子中演示了带有自动前缀的decltype脚本。自动类型推断关键字auto在C++11及以后的版本中被使用。