博客
关于我
c++11:std::declval、decltype
阅读量:716 次
发布时间:2019-03-21

本文共 1756 字,大约阅读时间需要 5 分钟。

C++中的类型推导与对象创建技巧

在C++语言中,decltype和std::declval是一对强大的工具,用于类型推导和对象创建。以下内容将从基本概念到实际应用详细探讨。

1. 类型推导(decltype)

类型推导(decltype)可以用来确定表达式的类型,这在编程中非常有用,特别是在处理模板和lambda函数时。

  • 基本用法

    使用decltype可以直接从表达式中获取其类型。例如:

    int i = 5;int j = decltype(i) x = i * 2;  // x的类型与i一致

    这里,x的类型从i的类型(int)推导而来。

  • 模板函数

    在模板函数中,返回类型通常依赖于模板参数。例如:

    template
    auto add(T t, U u) -> decltype(t + u) { return t + u;}

    返回类型随着t和u的类型而变化,这正是decltype的强大之处。

  • lambda函数

    对于lambda函数,decltype可以帮助我们指定其返回类型。例如:

    auto f = [](int a, int b) -> int {  return a * b;};decltype(f) g = f;  // g的类型与f一致

    这里的返回类型由lambda的操作确定。

2. 对象创建与类型推导(std::declval)

std::declval是一种强大的工具,它允许我们将任意类型T转换为引用类型。这在创建对象时特别有用,尤其当对象的构造函数是隐式或者特定的。

3. 代码实例与运行结果

  • 模板函数示例
    #include 
    #include
    int main() { int i = 33; auto j = i; // i是一个int,j也是int std::cout << "i = " << i << ", j = " << j << "\n"; auto f = [](int a, int b) -> int { return a * b; }; auto g = f; // g的类型与f一致 i = f(2, 2); // i = 4 std::cout << "i = " << i << "\n"; j = g(3, 3); // j = 9 std::cout << "j = " << j << "\n";}

4. 运行结果展示

  • 模板函数结果示例如图所示,j的值会随着fg的调用而改变。

总结而言,decltypestd::declval为C++程序员提供了强大的类型推导和对象创建工具,使得代码更简洁、可维护。这些工具在面对复杂数据结构和动态语言绑定时尤为有用。

转载地址:http://lbngz.baihongyu.com/

你可能感兴趣的文章
【自考】之信息资源管理(一)
查看>>
setup facatory9.0打包详细教程(含静默安装和卸载)
查看>>
java.security.InvalidKeyException: Illegal key size
查看>>
Linux kernel pwn --- CSAW2015 StringIPC
查看>>
IDEA 找不到 Persistence窗口解决办法
查看>>
C++ Primer Plus读书笔记:循环读取(错误处理)
查看>>
Form窗体属性
查看>>
vue 错误收集
查看>>
00010.02最基础客户信息管理软件(意义类的小项目,练习基础,不涉及数据库)
查看>>
00013.05 字符串比较
查看>>
Effective Java 读书笔记
查看>>
SpringBoot使用@Email报错误
查看>>
访问servlet时弹出文件下载框解决方法
查看>>
IDEA-@Slf4j和log标签&@Data(Lombok)无效
查看>>
SpringCloud-Eureka报错 Error creating bean with name解决
查看>>
Thymeleaf 生成下标,索引,使用Stat变量
查看>>
初始微服务---Springcloud发展【第一期】
查看>>
RAFT 拜占庭将军 共识算法
查看>>
UE4 错误列表 error码(只记录我遇到的情况,持续添加,未完成)
查看>>
cmd编译.java文件 : java:720: 错误: 编码GBK的不可映射字符 Why ? ? ? ?
查看>>