右值函数重载

2024-02-17

我想重载一个函数,以便它以某种方式操纵它的参数,然后返回对该参数的引用 - 但如果参数不可变,那么它应该返回一个被操纵的copy相反。 经过多年的摸索之后,这就是我想到的。

using namespace std;

string& foo(string &in)
{
    in.insert(0, "hello ");
    return in;
}

string foo(string &&in)
{
    return move(foo(in));
}

string foo(const string& in)
{
    return foo(string(in));
}

这段代码似乎工作正常,但我很想听听是否有人能想出更好的方法来做到这一点。

这是一个测试程序:

int main(void)
{
    string var = "world";
    const string var2 = "const world";
    cout << foo(var) << endl;
    cout << var << endl;

    cout << foo(var2) << endl;
    cout << var2 << endl;

    cout << foo(var + " and " + var2) << endl;
    return 0;
}

正确的输出是

hello world
hello world
hello const world
const world
hello hello world and const world

我想如果我能这样做的话会稍微整洁一些:

string& foo(string &in)
{
    in.insert(0, "hello ");
    return in;
}

string foo(string in)
{
    return move(foo(in));
}

当然,这是行不通的,因为大多数函数都会调用foo会是模棱两可的——包括调用foo本身!但如果我能以某种方式告诉编译器优先考虑第一个......

正如我所说,我发布的代码工作正常。我不喜欢它的主要一点是重复的额外代码。如果我有一堆这样的函数,那就会变得很混乱,而且大部分都会非常重复。因此,作为我的问题的第二部分:任何人都可以想出一种方法来自动生成第二个和第三个代码foo功能?例如

// implementation of magic_function_overload_generator
// ???

string& foo(string &in);
magic_function_overload_generator<foo>;

string& bar(string &in);
magic_function_overload_generator<bar>;

// etc

我会一起摆脱所有引用,只编写一个按值传递和返回的函数:

std::string foo(std::string in)
{
    in.insert(0, "hello ");
    return in;
}

如果传递左值,则将复制输入字符串。如果传递右值,它将被移动。

当离开函数时,命名返回值优化可能会启动,因此返回基本上是无操作。如果编译器决定不这样做,结果将被移动(即使in是左值)。

右值引用的好处是你必须思考less关于在用户代码中放置引用以提高效率的位置。对于可移动类型,按值传递实际上是最高效的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

右值函数重载 的相关文章

  • Grpc - 将消息从一个客户端发送到连接到同一服务器的另一个客户端

    是否可以将消息从一个客户端发送到连接到同一服务器的另一个客户端 我想将数据从一个客户端发送到服务器然后发送到特定客户端 我想我需要获取客户端 ID 但我不知道如何获取此 ID 以及如何从服务器将此消息发送到该客户端 我这里有一个样本 这是一
  • 将类对象放置在向量中?

    我注意到我可以将一个类放置在一个向量中 这是我的程序 我收到以下错误 out blackjack exe blackjack obj blackjack obj error LNK2019 unresolved external symbo
  • 转换 const void*

    我有一个函数返回一个const void 我想用它的信息作为char 我可以将它投射为 C 风格的罚款 char variable但是当我尝试使用reinterpret cast like reinterpret cast
  • java中如何重新初始化int数组

    class PassingRefByVal static void Change int pArray pArray 0 888 This change affects the original element pArray new int
  • 语音识别编程问题入门

    所以 你们可能都看过 钢铁侠 其中托尼与一个名为贾维斯的人工智能系统进行交互 演示剪辑here http www youtube com watch v Go8zsh1Ev6Y 抱歉 这是广告 我非常熟悉 C C 和 Visual Basi
  • 如何在 C# Designer.cs 代码中使用常量字符串?

    如何在 designer cs 文件中引用常量字符串 一个直接的答案是在我的 cs 文件中创建一个私有字符串变量 然后编辑 Designer cs 文件以使用此变量 而不是对字符串进行硬编码 但设计者不喜欢这样抛出错误 我明白为什么这行不通
  • 如何使用 ASP.NET Core 获取其他用户的声明

    我仍在学习 ASP NET Core 的身份 我正在进行基于声明的令牌授权 大多数示例都是关于 当前 登录用户的 就我而言 我的 RPC 服务正在接收身份数据库中某个用户的用户名和密码 我需要 验证是否存在具有此类凭据的用户 获取该用户的所
  • 获取没有显式特征的整数模板参数的有符号/无符号变体

    我希望定义一个模板类 其模板参数始终是整数类型 该类将包含两个成员 其中之一是类型T 另一个作为类型的无符号变体T 即如果T int then T Unsigned unsigned int 我的第一直觉是这样做 template
  • 在 .NET MAUI 中实现 TouchTracking

    我一直致力于将我们的应用程序从 Xamarin Forms 迁移到 NET MAUI 我们的应用程序几乎没有绘图功能 用户可以用手指进行绘图 我们用了TouchTrackingXamarin Forms 中的 nuget 包 但与 NET
  • 从 C# 使用 Odbc 调用 Oracle 包函数

    我在 Oracle 包中定义了一个函数 CREATE OR REPLACE PACKAGE BODY TESTUSER TESTPKG as FUNCTION testfunc n IN NUMBER RETURN NUMBER as be
  • 在 C# 中为父窗体中的子窗体控件添加事件处理程序

    我有两种形式 一种是带有按钮和文本框的父表单 单击该按钮时 将打开一个对话框 该子窗体又包含一个文本框和一个按钮 现在我想要的是 每当子表单文本框中的文本更改时 父表单文本框中的文本会自动更改 为了获得这个 我所做的是 Form3 f3 n
  • 比较:接口方法、虚方法、抽象方法

    它们各自的优点和缺点是什么 接口方法 虚拟方法 抽象方法 什么时候应该选择什么 做出这一决定时应牢记哪些要点 虚拟和抽象几乎是一样的 虚方法在基类中有一个实现 可以选择重写 而抽象方法则没有 并且must在子类中被覆盖 否则它们是相同的 在
  • 模板类中的无效数据类型生成编译时错误?

    我正在使用 C 创建一个字符串类 我希望该类仅接受数据类型 char 和 wchar t 并且我希望编译器在编译时使用 error 捕获任何无效数据类型 我不喜欢使用assert 我怎样才能做到这一点 您可以使用静态断言 促进提供一个 ht
  • Visual Studio 2015:v120 与 v140?

    仅供参考 Win10 x64 我今天开始尝试 Visual Studio 2015 在弄清楚如何运行 C C 部分后 我尝试加载一个大型个人项目 该项目使用非官方的glsdk http glsdk sourceforge net docs
  • C++:二叉树所有节点值的总和

    我正在准备面试 我被一个二叉树问题困住了 我们如何计算二叉树所有节点中存在的值的总和 优雅的递归解决方案 伪代码 def sum node if node NULL return 0 return node gt value sum nod
  • 了解 Lambda 表达式和委托 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我已经尝试解决这个问题很长一段时间了 阅读在线博客和文章 但到目前为止还没有成功 什么是代表 什么是 Lambda 表达式 两者的优点
  • 在 Win32 控制台应用程序中设置光标位置

    如何在 Win32 控制台应用程序中设置光标位置 最好 我想避免制作句柄并使用 Windows 控制台功能 我花了整个早上沿着那条黑暗的小巷跑 它产生的问题比它解决的问题还要多 我似乎记得当我在大学时使用 stdio 做这件事相对简单 但我
  • 无法将字符串文字分配给装箱的 std::string 向量

    这是我的类型系统的简化版本 include
  • MySqlConnectionStringBuilder - 使用证书连接

    我正在尝试连接到 Google Cloud Sql 这是一个 MySql 解决方案 我能够使用 MySql Workbench 进行连接 我如何使用 C 连接MySqlConnectionStringBuilder 我找不到提供这三个证书的
  • 当用户更改 Windows 中的语言键盘布局时如何通知?

    I want to show a message to user when the user changes the language keyboard layout of Windows for example from EN to FR

随机推荐

  • 如何计算 Django 模型中某些字段的平均值并将其发送到 REST API?

    我想计算评分的平均值 在评论模型中 并将其发送到我的 API 模型 py from django db import models from adminuser models import Categories from accounts
  • 如何在 SSMS 结果中搜索字符串/子字符串?

    这看起来非常简单 但由于某种原因 我没有找到任何关于如何做到这一点的信息 我正在使用 SQL Server Management Studio 2012 并且我有一组从 SELECT 查询返回的结果 例如 select a b from x
  • 如何为列表中的 3 个最高值建立索引?

    所以我有这两个列表 score 350 914 569 223 947 284 567 333 697 245 227 785 120 794 343 773 293 995 name Ryan Stacy Jenna Peter Soph
  • Installshield安装成功后,不启动exe

    我正在使用单个 MSI 项目 成功安装后 我选择复选框来启动我的软件 然后单击完成 即使我检查并单击 完成 它也不会启动我的软件 到目前为止 我发现确保启动目录有效的唯一方法是 启动产品 复选框的属性选项卡 其属性设置为 LAUNCHPRO
  • 获取 PHP 数组值并循环打印 [重复]

    这个问题在这里已经有答案了 我有一张有 9 行的表 第一列应打印排名中每个参与者的姓名 首先 我创建了一个包含它们名称的数组 names array Mike Kyle Johnny Will Vasques 对于此任务 我编写了一个 5
  • 在 Vim 中禁用“进入 Ex 模式”

    我每天都会偶然收到以下 10 次 进入防爆模式 输入 视觉 进入正常模式 如何在 Vim 中禁用导致它的组合
  • 在 numpy 中对某个范围内的随机浮点数进行采样

    如何在 numpy 中对区间 a b 上的随机浮点数进行采样 不只是整数 而是任何实数 例如 random float 5 10 将返回之间的随机数 5 10 谢谢 The 均匀分布 https numpy org doc stable r
  • Java Servlet容器性能如何?

    我想向这里的 Java 专业人士询问一个关于我当前即将进行的研究的问题 各种 servlet 容器的效率差异的关键因素是什么 我需要比较 Tomcat JBoss Glassfish Jetty 等 并且我需要知道哪些 因素 可能以最显着的
  • Windows Mobile 模拟器联网到主机

    我正在尝试在 VS2008 中进行一些 Windows Mobile 开发 WM 应用程序正在进行 WCF 调用 或尝试进行 模拟器和我的 WCF 服务器在同一台台式电脑上运行 我找到了一些关于如何结合Virtual PC2007在WM5模
  • 使用Twig生成JSON

    我想要一个返回简单 JSON 对象的 URL 我正在尝试使用 Twig 生成 JSON 对象 urls for child in page root child url if not loop last endif endfor 不过 回车
  • 如何在 SwiftUI 中放大 ScrollView

    我正在尝试在 Catalyst 应用程序的 SwiftUI 中缩放和平移图像 没有 PanGesture 但 ScrollView 似乎在 iPad 和 Mac 上都运行良好 我只是无法在放大的图像上滚动 struct TestScroll
  • Java EE 5 依赖注入?

    既然Java EE 5没有CDI 那么DI在这里是如何工作的呢 EJB可以注入吗 EJB在非 EJB 类中 可以EntityManager被注射 PersistenceContext在非 EJB 类中 容器管理的非资源本地的EntityMa
  • DotNetNuke 5.6.2 - 社区版用户可以使用 DNNRadMenu 吗? [关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 DotNetNuke 社区版中 DNNRadMenu 的使用存在不确定性 据我了解 从 DNN 5 6 2 开始 社区版用户可以使用 和修
  • 如何在 Spring boot 应用程序的嵌入式 untertow 中禁用 HTTP TRACE

    我的目标是为我的 Spring Boot 应用程序禁用 HTTP TRACE 方法 该应用程序使用嵌入式 undertow 最好进行有效的 yaml 更改 如果没有 更改代码也可以 理想情况下 最终结果应该是 4xx HTTP 响应代码 并
  • Window.popup 在浏览器中居中对齐

    我有一个动态生成的 Div 数据 我想在某个事件触发后在弹出窗口中打开该 div 数据 我的代码已经完成了 但是当弹出窗口在我的浏览器中打开时 它没有居中对齐 它出现在角落里 我的代码 var left window screen widt
  • Netstream 和step() 或seek()?

    我正在做一个 AS3 项目 正在播放视频 H264 由于某些特殊原因 我想去某个职位 a 我尝试使用 NetStream seek 在那里它只进入关键帧 在我当前的设置中 这意味着 我可以每 1 秒找到一个位置 为了获得更好的分辨率 我必须
  • Numpy 向量化:查找列表和列表列表之间的交集

    我试图找到列表和列表列表之间的交集 这个问题可以通过一个简单的 for 循环轻松解决 def find intersec x y result for i in range len y if set x intersection set y
  • 当前上下文中不存在名称<对象名称>

    大多数问题与旧版本有关ASP NET MVC 我的问题与最新相关 NET Core建立在框架4 6 我创建了一个控制台应用程序和标准类库 我安装了运行 WEB 所需的所有库 NET Core 一切工作正常 视图编译良好 调试视图也正常工作
  • PHP 选项下拉列表将选项设置为存储在数据库中的一个

    我有一个 PHP 表单 我用它来编辑 MySQL 数据库中的记录 它有一个值的下拉列表 我想将数据库中保存的选项设置为列表中的第一个选项 这样如果用户不想更改选项 那么数据库将不会被默认选项覆盖 任何人都可以提出一个非常简单的解决方案吗 根
  • 右值函数重载

    我想重载一个函数 以便它以某种方式操纵它的参数 然后返回对该参数的引用 但如果参数不可变 那么它应该返回一个被操纵的copy相反 经过多年的摸索之后 这就是我想到的 using namespace std string foo string