news 2026/5/25 5:35:04

C++函数返回双值的几种方法

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
C++函数返回双值的几种方法

在C++结合Qt的开发环境中,若要让函数返回两个double类型的值,有不少合适的数据类型可供选择。下面为你详细介绍几种常见的方案及其适用情形:

1.std::pair<double, double>

这是C++标准库提供的模板类,其主要功能就是将两个值组合成一个对象。它的优势在于使用起来非常简便,而且无需引入额外的依赖。

1

2

3

4

5

6

7

8

9

10

11

12

#include <utility>

std::pair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

return{value1, value2};// C++17及之后的统一初始化语法

}

// 调用示例

auto result = calculateValues();

doublea = result.first;

doubleb = result.second;

2.QPair<double, double>

QPair是Qt框架提供的类,它和std::pair的功能类似。不过,它能更好地和Qt的元对象系统以及序列化机制相融合。

1

2

3

4

5

6

7

8

9

10

11

12

#include <QPair>

QPair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

returnqMakePair(value1, value2);

}

// 调用示例

QPair<double,double> result = calculateValues();

doublea = result.first;

doubleb = result.second;

3. 自定义结构体(struct)

当返回值有具体的业务含义时,建议使用自定义结构体。这样可以让代码的可读性更强,维护起来也更加方便。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

structMyResult {

doublefirstValue;

doublesecondValue;

};

MyResult calculateValues() {

MyResult result;

result.firstValue = 3.14;

result.secondValue = 2.71;

returnresult;

}

// 调用示例

MyResult result = calculateValues();

doublea = result.firstValue;

doubleb = result.secondValue;

4.QPointF

要是返回的两个值代表二维平面上的坐标点,使用QPointF是个不错的选择。它还提供了一些几何操作函数。

1

2

3

4

5

6

7

8

9

10

11

12

#include <QPointF>

QPointF calculatePoint() {

doublex = 3.14;

doubley = 2.71;

returnQPointF(x, y);

}

// 调用示例

QPointF point = calculatePoint();

doublex = point.x();

doubley = point.y();

选择建议

  • 若返回值仅用于临时处理,不具备特定业务意义,可优先考虑std::pairQPair
  • 若返回值代表坐标、尺寸等具有几何意义的值,QPointFQSizeF是很好的选择。
  • 若返回值有明确的业务含义,像“价格和数量”“宽度和高度”等,建议使用自定义结构体。

在Qt项目里,以上几种方案都能正常使用。不过,使用Qt特定的类型(如QPairQPointF)可以让代码更好地融入Qt的生态系统。

5.std::pair额外说明

你想知道在C++中,除了使用C++17及之后的统一初始化语法return {value1, value2};,还有哪些方式可以从calculateValues函数中返回std::pair<double, double>类型的值。

以下是几种常用且兼容不同C++版本的写法,我会按兼容性和简洁性排序说明:

1. 显式调用std::pair构造函数(兼容所有C++版本)

这是最基础、兼容性最好的写法,从C++98开始就支持,无需依赖任何新特性:

1

2

3

4

5

6

7

8

#include <utility> // 必须包含std::pair的头文件

std::pair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

// 显式构造std::pair对象并返回

returnstd::pair<double,double>(value1, value2);

}

2. 使用std::make_pair(C++98+,简洁)

std::make_pair是一个模板函数,会自动推导参数的类型,无需手动指定<double, double>,代码更简洁:

1

2

3

4

5

6

7

8

#include <utility>

std::pair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

// 自动推导类型,返回std::pair<double, double>

returnstd::make_pair(value1, value2);

}

3. C++17类模板实参推导(CTAD)

C++17支持类模板实参推导,无需指定模板参数,直接用std::pair{}构造:

1

2

3

4

5

6

7

8

#include <utility>

std::pair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

// C++17特性:自动推导pair的模板参数

returnstd::pair{value1, value2};

}

4. 先创建对象再返回(兼容所有版本)

如果需要更清晰的逻辑(比如中间需要修改值),可以先创建pair对象,再返回:

1

2

3

4

5

6

7

8

9

10

#include <utility>

std::pair<double,double> calculateValues() {

doublevalue1 = 3.14;

doublevalue2 = 2.71;

// 先构造对象,可在中间修改值

std::pair<double,double> result(value1, value2);

// 例如:result.first += 1.0;

returnresult;

}

总结

  1. 兼容性优先:选择std::pair<double, double>(value1, value2)std::make_pair(value1, value2)(支持C++98及以上)。
  2. C++17及以上:优先用return {value1, value2}(统一初始化)或return std::pair{value1, value2}(CTAD),代码最简洁。
  3. 可读性优先:如果需要中间修改返回值,先创建pair对象再返回是更清晰的选择。

所有写法的核心都是构造std::pair<double, double>对象并返回,只是语法形式和兼容版本不同,功能上完全等价。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/25 5:31:44

VBA技术资料482_VBA_改变图表的颜色

我给VBA的定义&#xff1a;VBA是个人小型自动化处理的有效工具。利用好了&#xff0c;可以大大提高自己的工作效率&#xff0c;而且可以提高数据的准确度。“VBA语言専攻”提供的教程一共九套&#xff0c;分为初级、中级、高级三大部分&#xff0c;教程是对VBA的系统讲解&#…

作者头像 李华
网站建设 2026/5/25 5:30:58

EByFTVeS:基于BFT共识的VSS方案防御时序攻击,保障DPML安全

1. 项目概述&#xff1a;当VSS遇上BFT&#xff0c;一场关于“时机”的攻防战 在分布式隐私保护机器学习&#xff08;DPML&#xff09;这个赛道上&#xff0c;我们这些搞系统安全和密码学的人&#xff0c;每天都在和数据、模型、以及潜在的“内鬼”斗智斗勇。核心目标很明确&…

作者头像 李华
网站建设 2026/5/25 5:29:54

labview两个控件上下对中

在labview中&#xff0c;有时候需要程序控制两个控件的对中。直接上代码&#xff1a;这个其实就是根据控件的大小&#xff0c;通过计算来实现的。调控引用&#xff1a;是指要调控的控件的引用。参考引用&#xff1a;是指参考对象控件&#xff0c;以此控件为基准。两个控件的左右…

作者头像 李华
网站建设 2026/5/25 5:27:01

LOTUS:基于最优传输与元学习的无监督AutoML模型选择框架

1. 项目概述&#xff1a;当无监督学习遇上自动化&#xff0c;我们如何“盲选”最佳模型&#xff1f;在机器学习的世界里&#xff0c;自动化机器学习&#xff08;AutoML&#xff09;已经成为了一个炙手可热的话题。它承诺将我们从繁琐的算法选择、特征工程和超参数调优中解放出来…

作者头像 李华
网站建设 2026/5/25 5:25:46

URP Renderer Feature深度解析:生命周期、避坑指南与工业级实现

1. 这不是“加个脚本”就能搞定的渲染扩展——URP Renderer Feature 的真实定位与误用重灾区很多人第一次在URP项目里点开“Renderer Features”面板时&#xff0c;下意识会把它当成“Unity旧版Post-Processing Stack的平替”或者“一个能塞自定义Shader的快捷入口”。我见过太…

作者头像 李华