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

概述

类型推导主要是依赖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);
	
}
posted @ 2023-07-13 12:51  寡人正在Coding  阅读(189)  评论(0编辑  收藏  举报