C++语法|typename关键字

2024-05-08 05:36
文章标签 c++ 语法 关键字 typename

本文主要是介绍C++语法|typename关键字,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

  • 典型用法——模板类型参数
  • 更多用法(加粗的是重点)

典型用法——模板类型参数

  1. 代替class关键字
    在作为模板类型参数时,class与typename可以互换
tmplate <typename T> T foo (T* p)
{T tmp = *p; //tmp的类型将是指针p指向的类型//...return tmp;
}tmplate <typename T, class U> calc (const T&, const U&);
  1. 在模板中获取变量类型
    实例一:
1 template <class T>
2 void foo() {
3     typename T::iterator * iter;  // typename用于告诉编译器,T::iterator是一个类型而不是一个变量;否则编译器可能认为它是一个乘法操作
4 }
5 
6 struct ContainsAType {
7     struct iterator;
8 };
9 
10 foo<ContainsAType>();

实例二:
在 C++ 模板编程中,当使用依赖于模板参数的类型时,必须在这些类型前明确指定 typename 关键字。这是因为,在模板实例化之前编译器无法确定 Container::iterator 是一个类型还是一个静态成员变量或其他成员。使用 typename 明确告诉编译器 Container::iterator 是一个类型

template<typename Container>
void showContainer(Container &con) {//Container::iterator it = con.begin();   报错typename Container::iterator it = con.begin();  // 添加 typenamefor (; it != con.end(); ++it) {cout << *it << " ";}cout << endl;
}

更多用法(加粗的是重点)

这里来源于https://zh.cppreference.com/w/cpp/keyword/typename的描述

  • 在模板声明的模板形参列表中,typename 可用作 class 的代替品,以声明类型模板形参模板模板形参 (C++17 起)。
// 类型模板形参
template<typename T>
class MyClass {// 类型模板形参 T 在这里使用
};// 模板模板形参
template<template<typename> class Template>
class MyTemplateClass {// 模板模板形参 Template 在这里使用
};
  • 在模板的声明或定义内,typename 可用于声明某个待决的有限定名是类型。与在模板中获取变量类型一致
template<typename T>
void someFunction() {// 声明待决的有限定名是类型typename T::SomeType variable;// 这里编译器知道 T::SomeType 是一个类型,因此需要使用 typename 关键字
}
  • 在模板的声明或定义内, (C++11 前)typename 可在非待决的有限定类型名之前使用。此情况下它没有效果。
template<typename T>
void someFunction() {// C++11 前,typename 可以在非待决的有限定类型名之前使用,但没有效果typename int::SomeType variable;// 这里的 typename 没有实际效果,因为 int 不是有限定名
}
  • 在类型要求的要求中。(C++20 起)
#include <iostream>
#include <concepts>// 定义一个 concept,要求类型 T 必须是整数类型
template<typename T>
concept Integral = std::is_integral_v<T>;// 使用 Integral concept 作为模板参数的约束
template<Integral T>
void printInteger(T value) {std::cout << value << std::endl;
}int main() {printInteger(42);  // 合法调用,整数类型符合 Integral concept 的要求printInteger(3.14);  // 编译时错误,浮点数类型不符合 Integral concept 的要求return 0;
}

这篇关于C++语法|typename关键字的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/969446

相关文章

C#如何调用C++库

《C#如何调用C++库》:本文主要介绍C#如何调用C++库方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录方法一:使用P/Invoke1. 导出C++函数2. 定义P/Invoke签名3. 调用C++函数方法二:使用C++/CLI作为桥接1. 创建C++/CL

Python正则表达式语法及re模块中的常用函数详解

《Python正则表达式语法及re模块中的常用函数详解》这篇文章主要给大家介绍了关于Python正则表达式语法及re模块中常用函数的相关资料,正则表达式是一种强大的字符串处理工具,可以用于匹配、切分、... 目录概念、作用和步骤语法re模块中的常用函数总结 概念、作用和步骤概念: 本身也是一个字符串,其中

C++如何通过Qt反射机制实现数据类序列化

《C++如何通过Qt反射机制实现数据类序列化》在C++工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作,所以本文就来聊聊C++如何通过Qt反射机制实现数据类序列化吧... 目录设计预期设计思路代码实现使用方法在 C++ 工程中经常需要使用数据类,并对数据类进行存储、打印、调试等操作。由于数据类

Mysql用户授权(GRANT)语法及示例解读

《Mysql用户授权(GRANT)语法及示例解读》:本文主要介绍Mysql用户授权(GRANT)语法及示例,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql用户授权(GRANT)语法授予用户权限语法GRANT语句中的<权限类型>的使用WITH GRANT

HTML5表格语法格式详解

《HTML5表格语法格式详解》在HTML语法中,表格主要通过table、tr和td3个标签构成,本文通过实例代码讲解HTML5表格语法格式,感兴趣的朋友一起看看吧... 目录一、表格1.表格语法格式2.表格属性 3.例子二、不规则表格1.跨行2.跨列3.例子一、表格在html语法中,表格主要通过< tab

Linux下如何使用C++获取硬件信息

《Linux下如何使用C++获取硬件信息》这篇文章主要为大家详细介绍了如何使用C++实现获取CPU,主板,磁盘,BIOS信息等硬件信息,文中的示例代码讲解详细,感兴趣的小伙伴可以了解下... 目录方法获取CPU信息:读取"/proc/cpuinfo"文件获取磁盘信息:读取"/proc/diskstats"文

Java使用ANTLR4对Lua脚本语法校验详解

《Java使用ANTLR4对Lua脚本语法校验详解》ANTLR是一个强大的解析器生成器,用于读取、处理、执行或翻译结构化文本或二进制文件,下面就跟随小编一起看看Java如何使用ANTLR4对Lua脚本... 目录什么是ANTLR?第一个例子ANTLR4 的工作流程Lua脚本语法校验准备一个Lua Gramm

Java字符串操作技巧之语法、示例与应用场景分析

《Java字符串操作技巧之语法、示例与应用场景分析》在Java算法题和日常开发中,字符串处理是必备的核心技能,本文全面梳理Java中字符串的常用操作语法,结合代码示例、应用场景和避坑指南,可快速掌握字... 目录引言1. 基础操作1.1 创建字符串1.2 获取长度1.3 访问字符2. 字符串处理2.1 子字

C++使用printf语句实现进制转换的示例代码

《C++使用printf语句实现进制转换的示例代码》在C语言中,printf函数可以直接实现部分进制转换功能,通过格式说明符(formatspecifier)快速输出不同进制的数值,下面给大家分享C+... 目录一、printf 原生支持的进制转换1. 十进制、八进制、十六进制转换2. 显示进制前缀3. 指

C#中async await异步关键字用法和异步的底层原理全解析

《C#中asyncawait异步关键字用法和异步的底层原理全解析》:本文主要介绍C#中asyncawait异步关键字用法和异步的底层原理全解析,本文给大家介绍的非常详细,对大家的学习或工作具有一... 目录C#异步编程一、异步编程基础二、异步方法的工作原理三、代码示例四、编译后的底层实现五、总结C#异步编程