C++泛型编程指南04-(对默认调用参数的类型推断)

文章目录

      • 问题描述
      • 解决方案
        • 示例代码
      • 关键点解释
      • 进一步改进:结合概念约束

你提到的情况确实是一个常见的问题:在C++中,类型推断不适用于默认调用参数。这意味着如果你希望函数模板能够通过默认参数来实例化,你需要为模板参数提供一个默认类型。下面我将详细解释这个问题,并提供解决方案。

问题描述

当你定义一个带有默认调用参数的函数模板时,如果仅使用默认参数进行调用,则编译器无法推断出模板参数的类型。例如:

template<typename T>
void f(T = "") {
    std::cout << "Function called with type: " << typeid(T).name() << std::endl;
}

int main() {
    f(1); // OK: T 被推断为 int, 调用 f<int>(1)
    f();  // ERROR: 无法推断 T 的类型
}

在这个例子中,f()调用会导致编译错误,因为编译器无法确定T的类型。

解决方案

为了使函数模板能够在没有显式参数的情况下被调用,你可以为模板参数提供一个默认类型。这样,当没有提供实际参数时,编译器可以使用默认类型进行实例化。

示例代码

以下是如何为模板参数声明默认类型的示例:

#include <iostream>
#include <typeinfo>

// 定义一个带有默认模板参数和默认调用参数的函数模板
template<typename T = std::string>
void f(T arg = "") {
    std::cout << "Function called with type: " << typeid(T).name() << std::endl;
    std::cout << "Argument value: " << arg << std::endl;
}

int main() {
    // 显式传递参数,T 被推断为 int
    f(1); // 输出: Function called with type: i
          //        Argument value: 1

    // 使用默认参数调用,T 使用默认类型 std::string
    f();  // 输出: Function called with type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
          //        Argument value: (空字符串)

    // 显式指定模板参数类型
    f<std::string>("hello"); // 输出: Function called with type: NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE
                             //        Argument value: hello
}

关键点解释

  1. 默认模板参数:在函数模板f中,我们为模板参数T提供了默认类型std::string。这使得在没有显式指定模板参数的情况下,编译器可以使用std::string作为T的类型。

  2. 默认调用参数:我们还为函数参数arg提供了一个默认值""(空字符串)。这个默认值与默认模板参数一起工作,确保在没有任何参数传递给函数时,函数仍然可以正确地实例化和调用。

  3. 调用行为

    • f(1);:显式传递一个整数参数,T被推断为int
    • f();:使用默认参数调用,T使用默认类型std::string,并且arg取默认值""
    • f<std::string>("hello");:显式指定模板参数类型为std::string,并传递一个字符串参数。

进一步改进:结合概念约束

你还可以结合概念约束来增强模板的安全性和灵活性。例如:

#include <concepts>
#include <iostream>
#include <typeinfo>
#include <string>

// 定义一个概念,要求类型 T 支持输出操作
template<typename T>
concept Printable = requires(T t) {
    { std::cout << t } -> std::same_as<std::ostream&>;
};

// 定义一个带有默认模板参数和默认调用参数的函数模板
template<typename T = std::string>
requires Printable<T>
void f(T arg = "") {
    std::cout << "Function called with type: " << typeid(T).name() << std::endl;
    std::cout << "Argument value: " << arg << std::endl;
}

int main() {
    f(1); // OK: T 被推断为 int, 调用 f<int>(1)
    f();  // OK: T 使用默认类型 std::string, 调用 f<std::string>("")
    // 下面这行代码会因为 int 不满足 Printable 约束而编译失败
    // f<int>(); 
}

在这个例子中,我们引入了一个概念Printable,它要求类型T必须支持输出操作。这样可以确保只有符合条件的类型才能实例化函数模板f

通过这种方式,你可以更灵活地控制模板参数的推导过程,并结合其他现代C++特性来增强代码的安全性和可读性。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/963334.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

HTMLCSS :下雪了

这段代码创建了一个动态的雪花飘落加载动画&#xff0c;通过 CSS 技术实现了雪花的下落和消失效果&#xff0c;为页面添加了视觉吸引力和动态感。 大家复制代码时&#xff0c;可能会因格式转换出现错乱&#xff0c;导致样式失效。建议先少量复制代码进行测试&#xff0c;若未能…

Android 音视频编解码 -- MediaCodec

引言 如果我们只是简单玩一下音频、视频播放&#xff0c;那么使用 MediaPlayer SurfaceView 播放就可以了&#xff0c;但如果想加个水印&#xff0c;加点其他特效什么的&#xff0c;那就不行了&#xff1b; 学习 Android 自带的硬件码类 – MediaCodec。 MediaCodec 介绍 在A…

一文了解阿里的 Qwen2.5 模型

最近被DeepSeek刷屏了&#xff0c;但是在之外阿里在2025年1月28日推出了Qwen 2.5 Max模型。 Qwen2.5-Max 的特点&#xff1a;大规模的 MoE 模型&#xff0c;预训练于超 20 万亿 tokens&#xff0c;并经过 SFT 和 RLHF 后训练。 性能表现&#xff1a;在多个基准测试中与领先模型…

DeepSeek R1 linux云部署

云平台&#xff1a;AutoDL 模型加载工具&#xff1a;Ollama 参考&#xff1a;https://github.com/ollama/ollama/blob/main/docs/linux.md 下载Ollama 服务器上下载ollama比较慢&#xff0c;因此我使用浏览器先下载到本地电脑上。 https://ollama.com/download/ollama-linux…

FlashAttention v1 论文解读

论文标题&#xff1a;FlashAttention: Fast and Memory-Efficient Exact Attention with IO-Awareness 论文地址&#xff1a;https://arxiv.org/pdf/2205.14135 FlashAttention 是一种重新排序注意力计算的算法&#xff0c;它无需任何近似即可加速注意力计算并减少内存占用。…

Vue - shallowRef 和 shallowReactive

一、shallowRef 和 shallowReactive &#xff08;一&#xff09;shallowRef 在 Vue 3 中&#xff0c;shallowRef 是一个用于创建响应式引用的 API&#xff0c;它与 ref 相似&#xff0c;但它只会使引用的基本类型&#xff08;如对象、数组等&#xff09;表现为响应式&#xf…

【深度学习】softmax回归的简洁实现

softmax回归的简洁实现 我们发现(通过深度学习框架的高级API能够使实现)(softmax)线性(回归变得更加容易)。 同样&#xff0c;通过深度学习框架的高级API也能更方便地实现softmax回归模型。 本节继续使用Fashion-MNIST数据集&#xff0c;并保持批量大小为256。 import torch …

ESP32-c3实现获取土壤湿度(ADC模拟量)

1硬件实物图 2引脚定义 3使用说明 4实例代码 // 定义土壤湿度传感器连接的模拟输入引脚 const int soilMoisturePin 2; // 假设连接到GPIO2void setup() {// 初始化串口通信Serial.begin(115200); }void loop() {// 读取土壤湿度传感器的模拟值int sensorValue analogRead…

【python】python油田数据分析与可视化(源码+数据集)【独一无二】

&#x1f449;博__主&#x1f448;&#xff1a;米码收割机 &#x1f449;技__能&#x1f448;&#xff1a;C/Python语言 &#x1f449;专__注&#x1f448;&#xff1a;专注主流机器人、人工智能等相关领域的开发、测试技术。 【python】python油田数据分析与可视化&#xff08…

代码讲解系列-CV(一)——CV基础框架

文章目录 一、环境配置IDE选择一套完整复现安装自定义cuda算子 二、Linux基础文件和目录操作查看显卡状态压缩和解压 三、常用工具和pipeline远程文件工具版本管理代码辅助工具 随手记录下一个晚课 一、环境配置 pytorch是AI框架用的很多&#xff0c;或者 其他是国内的框架 an…

HTB:Alert[WriteUP]

目录 连接至HTB服务器并启动靶机 信息收集 使用rustscan对靶机TCP端口进行开放扫描 使用nmap对靶机TCP开放端口进行脚本、服务扫描 使用nmap对靶机TCP开放端口进行漏洞、系统扫描 使用nmap对靶机常用UDP端口进行开放扫描 使用ffuf对alert.htb域名进行子域名FUZZ 使用go…

小红的合数寻找

A-小红的合数寻找_牛客周赛 Round 79 题目描述 小红拿到了一个正整数 x&#xff0c;她希望你在 [x,2x] 区间内找到一个合数&#xff0c;你能帮帮她吗&#xff1f; 一个数为合数&#xff0c;当且仅当这个数是大于1的整数&#xff0c;并且不是质数。 输入描述 在一行上输入一…

Linux环境下的Java项目部署技巧:安装 Mysql

查看 myslq 是否安装&#xff1a; rpm -qa|grep mysql 如果已经安装&#xff0c;可执行命令来删除软件包&#xff1a; rpm -e --nodeps 包名 下载 repo 源&#xff1a; http://dev.mysql.com/get/mysql80-community-release-el7-7.noarch.rpm 执行命令安装 rpm 源(根据下载的…

基于springboot+vue的哈利波特书影音互动科普网站

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;…

在React中使用redux

一、首先安装两个插件 1.Redux Toolkit 2.react-redux 第一步&#xff1a;创建模块counterStore 第二步&#xff1a;在store的入口文件进行子模块的导入组合 第三步&#xff1a;在index.js中进行store的全局注入 第四步&#xff1a;在组件中进行使用 第五步&#xff1a;在组件中…

记录 | 基于MaxKB的文字生成视频

目录 前言一、安装SDK二、创建视频函数库三、调试更新时间 前言 参考文章&#xff1a;如何利用智谱全模态免费模型&#xff0c;生成大家都喜欢的图、文、视并茂的文章&#xff01; 自己的感想 本文记录了创建文字生成视频的函数库的过程。如果想复现本文&#xff0c;需要你逐一…

Redis|前言

文章目录 什么是 Redis&#xff1f;Redis 主流功能与应用 什么是 Redis&#xff1f; Redis&#xff0c;Remote Dictionary Server&#xff08;远程字典服务器&#xff09;。Redis 是完全开源的&#xff0c;使用 ANSIC 语言编写&#xff0c;遵守 BSD 协议&#xff0c;是一个高性…

安全防护前置

就业概述 网络安全工程师/安全运维工程师/安全工程师 安全架构师/安全专员/研究院&#xff08;数学要好&#xff09; 厂商工程师&#xff08;售前/售后&#xff09; 系统集成工程师&#xff08;所有计算机知识都要会一点&#xff09; 学习目标 前言 网络安全事件 蠕虫病毒--&…

开源2 + 1链动模式AI智能名片S2B2C商城小程序视角下从产品经营到会员经营的转型探究

摘要&#xff1a;本文聚焦于开源2 1链动模式AI智能名片S2B2C商城小程序&#xff0c;深入探讨在其应用场景下&#xff0c;企业从产品经营向会员经营转型的必要性与策略。通过分析如何借助该平台优化会员权益与价值&#xff0c;解决付费办卡的接受度问题&#xff0c;揭示其在提升…

让banner.txt可以自动读取项目版本

文章目录 1.sunrays-dependencies1.配置插件2.pluginManagement统一指定版本 2.common-log4j2-starter1.banner.txt使用$ 符号取出2.查看效果 1.sunrays-dependencies 1.配置插件 <!-- 为了让banner.txt自动获取版本号 --><plugin><groupId>org.apache.mave…