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

 更新时间:2026年01月13日 10:03:30   作者:CSDN_RTKLIB  
本文介绍了在C++和Qt开发中返回两个double值的几种方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

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

1.std::pair<double, double>

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

#include <utility>

std::pair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    return {value1, value2}; // C++17及之后的统一初始化语法
}

// 调用示例
auto result = calculateValues();
double a = result.first;
double b = result.second;

2.QPair<double, double>

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

#include <QPair>

QPair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    return qMakePair(value1, value2);
}

// 调用示例
QPair<double, double> result = calculateValues();
double a = result.first;
double b = result.second;

3. 自定义结构体(struct)

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

struct MyResult {
    double firstValue;
    double secondValue;
};

MyResult calculateValues() {
    MyResult result;
    result.firstValue = 3.14;
    result.secondValue = 2.71;
    return result;
}

// 调用示例
MyResult result = calculateValues();
double a = result.firstValue;
double b = result.secondValue;

4.QPointF

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

#include <QPointF>

QPointF calculatePoint() {
    double x = 3.14;
    double y = 2.71;
    return QPointF(x, y);
}

// 调用示例
QPointF point = calculatePoint();
double x = point.x();
double y = 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开始就支持,无需依赖任何新特性:

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

std::pair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 显式构造std::pair对象并返回
    return std::pair<double, double>(value1, value2);
}

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

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

#include <utility>

std::pair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 自动推导类型,返回std::pair<double, double>
    return std::make_pair(value1, value2);
}

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

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

#include <utility>

std::pair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // C++17特性:自动推导pair的模板参数
    return std::pair{value1, value2};
}

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

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

#include <utility>

std::pair<double, double> calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 先构造对象,可在中间修改值
    std::pair<double, double> result(value1, value2);
    // 例如:result.first += 1.0;
    return result;
}

总结

  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>对象并返回,只是语法形式和兼容版本不同,功能上完全等价。

到此这篇关于C++函数返回双值的几种方法的文章就介绍到这了,更多相关C++函数返回双值内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • strcat 函数的使用指南

    strcat 函数的使用指南

    strcat是连接字符串的函数。函数返回指针,两个参数都是指针,第一个参数所指向的内存的地址必须能容纳两个字符串连接后的大小。
    2015-09-09
  • QT通过C++线程池运行Lambda自定义函数流程详解

    QT通过C++线程池运行Lambda自定义函数流程详解

    最近在接触公司的一个QT桌面项目,其中里面有一个模块是使用线程池去运行自定义函数的,自己潜心研究那个线程池代码一天,发现研究不透,看不懂,里面几乎都是使用C++11的新特性进行编写
    2022-10-10
  • C语言中常见的六种动态内存错误总结

    C语言中常见的六种动态内存错误总结

    学习过C语言中的动态内存函数,例如【malloc】、【calloc】、【realloc】、【free】,那它们在使用的过程中会碰到哪些问题呢,本本文我们一起来探讨下,感兴趣的朋友跟着小编一起来看看吧
    2023-11-11
  • VC中SDK与MFC的区别浅析

    VC中SDK与MFC的区别浅析

    这篇文章主要介绍了VC中SDK与MFC的区别浅析,需要的朋友可以参考下
    2014-07-07
  • C++ 关于MFC List Control 控件的总结

    C++ 关于MFC List Control 控件的总结

    这篇文章主要介绍了C++ 关于MFC List Control 控件的总结的相关资料,十分的详细,有需要的朋友可以参考下
    2015-06-06
  • C++中继承基类与派生类的区别

    C++中继承基类与派生类的区别

    这篇文章主要介绍了C++中继承基类与派生类的区别,面向对象程序设计中最重要的一个概念是继承。继承允许我们依据另一个类来定义一个类,这使得创建和维护一个应用程序变得更容易,需要的朋友可以参考下
    2023-05-05
  • C++设计模式之工厂方法模式的实现及优缺点

    C++设计模式之工厂方法模式的实现及优缺点

    工厂方法模式是一个创建型设计模式,通过定义一个创建对象的接口,让其子类决定实例化哪一个工厂类,这篇文章主要给大家介绍了关于C++设计模式之工厂方法模式的实现及优缺点,需要的朋友可以参考下
    2021-06-06
  • C++11中匿名函数lambda的使用详解

    C++11中匿名函数lambda的使用详解

    我最早接触lambda的概念是在matlab中,那时候在做数值模拟的课题,lambda可以快速定义简单的函数,当时觉得好方便。任何语言都有这个功能,下面来看看C++11新引入的lambda是如何使用的吧
    2023-04-04
  • 详解C++中的函数调用和下标以及成员访问运算符的重载

    详解C++中的函数调用和下标以及成员访问运算符的重载

    这篇文章主要介绍了详解C++中的函数调用和下标以及成员访问运算符,讲到了这些二元运算符使用的语法及重载,需要的朋友可以参考下
    2016-01-01
  • C/C++杂记 虚函数的实现的基本原理(图文)

    C/C++杂记 虚函数的实现的基本原理(图文)

    这篇文章主要介绍了C/C++杂记 虚函数的实现的基本原理(图文),需要的朋友可以参考下
    2016-06-06

最新评论