首页 > 编程语言 >现代C++(Modern C++)基本用法实践:一、类型推导

现代C++(Modern C++)基本用法实践:一、类型推导

时间:2023-07-13 13:02:34浏览次数:36  
标签:decltype LOG 推导 auto Modern C++ VAR TYPE

概述

类型推导主要是依赖auto关键字和decltype关键字/运算符实现的,具体用法参考下面的例子。

二者特点:

  • auto 用于声明时推导遍历
  • decltype 用于推导各种表达式, decltype(var)中var也是一种称为变量表达式的表达式
  • 二者都是在编译时进行推导。
  • 引用类型推断:decltype推断变量类型时会保留引用性质,而auto会忽略引用性质,将其推断非引用类型

使用场合:

  • decltype适用于需要根据表达式类型声明变量的场合,特别是在模板元编程和泛型编程中,可以用于推断函数返回类型、模板参数类型等。
  • auto适用于需要根据初始化值推断变量类型的场合,可以简化代码,减少类型冗余,提高代码的可读性和可维护性。它特别适用于迭代器、范围循环、lambda表达式等情况下。

用法举例

参考测试项目的modrenc_auto_decltype.cpp文件
主要内容:

  • auto 推导变量和返回值时的使用场景
  • decltype 推导各种表达式的使用场景
  • decltype 用于完美转发
#include "ModernCppTestHeader.h"

namespace n_auto {

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

	// C++ 支持值模板
	template <auto n>
	auto f() -> std::pair<decltype(n), decltype(n)>
	{
		return { n, n };
	}

	// 完美转发 decltype(auto)
	template <class F, class... Args>
	decltype(auto) pref_forward(F f, Args&&... args)
	{
		return f(std::forward<Args>(args)...);
	}
}

void auto_decltype_test()
{
	LOG_FUNC();


	LOG_TAG("auto&decltype 推导变量");
	auto a0				= 1 + 2;
	auto a1				= a0;
	decltype(auto) a2	= a0;
	decltype(auto) a3	= (a0);
	auto a4				= { 1, 2 };
	auto a5               {10}; //使用{}构造器
	auto [a6, a7]		= n_auto::f<0>(); //结构化绑定
	auto a8				= n_auto::add(1, 1.2);

	LOG_VAR_TYPE(a0);
	LOG_VAR_TYPE(a1);
	LOG_VAR_TYPE(a2);
	LOG_VAR_TYPE(a3);
	LOG_VAR_TYPE(a4);
	LOG_VAR_TYPE(a5);
	LOG_VAR(a6);
	LOG_VAR_TYPE(a6);
	LOG_VAR(a7);
	LOG_VAR_TYPE(a7);
	LOG_VAR_TYPE(a8);


	LOG_TAG("auto 用于指代lambda");
	auto b0 = [](int x) {LOG_VAR(x); };
	b0(10);


	LOG_TAG("decltype(auto) 用于完美转发");
	auto c0 = [](int x1, int x2) {return x1 + x2; };
	auto c1 = n_auto::pref_forward(c0, 1, 5);
	LOG_VAR(c1);
	
}

标签:decltype,LOG,推导,auto,Modern,C++,VAR,TYPE
From: https://www.cnblogs.com/hggzhang/p/17523866.html

相关文章

  • 现代C++(Modern C++)基本用法实践:五、智能指针(Smart Pointers)
    概述c++效率较高的一个原因是我们可以自己定制策略手动申请和释放内存,当然,也伴随着开发效率降低和内存泄漏的风险。为了减少手动管理内存带来的困扰,c++提出了智能指针,可以帮助我们进行内存管理,有三种:std::unique_ptr是一种独占所有权的智能指针,它不允许多个指针指向同一个对......
  • 现代C++(Modern C++)基本用法实践:四、模板
    概述C++的模板是泛型编程思想的一种实现。C++是强类型语言,处处强调类型。同样的加法运算,int和float的加法运算需定义两个函数(重载),而使用模板则可以只用一个函数(见下面示例)。这类似我们面向对象所说的多态(定义加法运算,各个类型有不同的实现),所以是所谓静多态的一种实现方式,不同的......
  • 现代C++(Modern C++)基本用法实践:三、移动语义
    概述移动移动(move)语义C++引入了一种新的内存优化,以避免不必要的拷贝。在构造或者赋值的时候,如果实参是右值(或者左值由std::move转换成右值),便会匹配移动语义的函数调用如下述举例的Str(Str&&obj)。移动语义的本质是将资源(内存/句柄)转移给另一个对象,被转移资源的对象不应再被使......
  • 现代C++(Modern C++)基本用法实践:二、Lambda表达式
    概述lambda表达式,有时也被称为匿名函数。他提供了简短的,内联的函数对象。用法形式如:[capture](parameters)->return_type{body}具体用法如下文举例它的实现是由编译器决定的,在我的编译器上他是通过创建一个匿名类,通过重载()运算符,成为一个可调用对象,从而实现调用,类似://......
  • 现代C++(Modern C++)基本用法实践:七、范围遍历
    概述c++的for循环在语法上有些刻板,近几个版本对此进行了优化,支持了基于范围的for循环用法举例参考测试项目代码ModernCppTest/modrenc_range_for.cpp主要内容:数组遍历vector遍历字符串遍历map遍历#include"ModernCppTestHeader.h"#include<vector>#include<map>......
  • 现代C++(Modern C++)基本用法实践:六、constexpr编译时计算
    概述constexpr修饰的变量、函数、对象构造函数表示在编译时就可以确定。它经常用来计算一些编译期可以确定常数,和常数组成的表。比如编译时确定10000以内所有的素数,运行时用的时候直接查表。用法举例参考测试项目代码ModernCppTest/modrenc_constexpr.cpp主要内容:constexpr......
  • 现代C++(Modern C++)基本用法实践:零、概述&测试项目
    序言习惯上,我们把C++11之前的C++语法特性称之为“传统C++”,而把c++11之后的语法特性称之为现代C++。有一种说法称C++为中级语言,因为它的特性介于低级语言(如各类汇编语言)和高级语言(Python、C#)之间--一般来说,它在运行效率上比高级语言要高,而在开发效率上又比高级语言低一些。随着C......
  • 现代C++(Modern C++)基本用法实践:N、其他零散的常用特性
    概述这一篇简单介绍一些其他的比较实用的特性,如果读者想了解现代C++的全部特性,参考:cppreference其他特性预置和弃置函数default&delete在C++11中引入了default和delete关键字,允许程序员更加明确地控制类的默认操作(如默认构造函数,拷贝构造函数,拷贝赋值运算符,析构函数等)......
  • 现代C++(Modern C++)基本用法实践:八、线程支持
    概述在c++11之前,c++并未对线程编程提供直接的支持。在c++11之后,支持了线程管理、同步、条件变量等支持。在其他的c++库中(例如UE的线程库)还增加了多任务模型的抽象。用法举例参考测试项目的modrenc_auto_decltype.cpp文件主要内容:线程的创建使用future&async进行异步操作......
  • PAT-甲级-1007 Maximum Subsequence Sum C++
    Givenasequenceof K integers{ N1​, N2​,..., N​K }.Acontinuoussubsequenceisdefinedtobe{ Ni​, Ni+1​,..., Nj​ }where 1≤i≤j≤K.TheMaximumSubsequenceisthecontinuoussubsequencewhichhasthelargestsumofitselements.Fore......