吴家荣 發表於 2026-1-13 10:03:30

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

<div id="navCategory"><h5 class="catalogue">目录</h5><ul class="first_class_ul"><li>1.std::pair&lt;double, double&gt;</li><li>2.QPair&lt;double, double&gt;</li><li>3. 自定义结构体(struct)</li><li>4.QPointF</li><li>选择建议</li><li>5.std::pair额外说明</li><ul class="second_class_ul"><li>1. 显式调用std::pair构造函数(兼容所有C++版本)</li><li>2. 使用std::make_pair(C++98+,简洁)</li><li>3. C++17类模板实参推导(CTAD)</li><li>4. 先创建对象再返回(兼容所有版本)</li></ul><li>总结</li><ul class="second_class_ul"></ul></ul></div><p>在C++结合Qt的开发环境中,若要让函数返回两个<code>double</code>类型的值,有不少合适的数据类型可供选择。下面为你详细介绍几种常见的方案及其适用情形:</p>
<p class="maodian"></p><h2>1.std::pair&lt;double, double&gt;</h2>
<p>这是C++标准库提供的模板类,其主要功能就是将两个值组合成一个对象。它的优势在于使用起来非常简便,而且无需引入额外的依赖。</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;utility&gt;

std::pair&lt;double, double&gt; 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;
</pre></div>
<p class="maodian"></p><h2>2.QPair&lt;double, double&gt;</h2>
<p><code>QPair</code>是Qt框架提供的类,它和<code>std::pair</code>的功能类似。不过,它能更好地和Qt的元对象系统以及序列化机制相融合。</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QPair&gt;

QPair&lt;double, double&gt; calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    return qMakePair(value1, value2);
}

// 调用示例
QPair&lt;double, double&gt; result = calculateValues();
double a = result.first;
double b = result.second;
</pre></div>
<p class="maodian"></p><h2>3. 自定义结构体(struct)</h2>
<p>当返回值有具体的业务含义时,建议使用自定义结构体。这样可以让代码的可读性更强,维护起来也更加方便。</p>
<div class="jb51code"><pre class="brush:cpp;">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;
</pre></div>
<p class="maodian"></p><h2>4.QPointF</h2>
<p>要是返回的两个值代表二维平面上的坐标点,使用<code>QPointF</code>是个不错的选择。它还提供了一些几何操作函数。</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;QPointF&gt;

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();
</pre></div>
<p class="maodian"></p><h2>选择建议</h2>
<ul><li>若返回值仅用于临时处理,不具备特定业务意义,可优先考虑<code>std::pair</code>或<code>QPair</code>。</li><li>若返回值代表坐标、尺寸等具有几何意义的值,<code>QPointF</code>或<code>QSizeF</code>是很好的选择。</li><li>若返回值有明确的业务含义,像&ldquo;价格和数量&rdquo;&ldquo;宽度和高度&rdquo;等,建议使用自定义结构体。</li></ul>
<p>在Qt项目里,以上几种方案都能正常使用。不过,使用Qt特定的类型(如<code>QPair</code>、<code>QPointF</code>)可以让代码更好地融入Qt的生态系统。</p>
<p class="maodian"></p><h2>5.std::pair额外说明</h2>
<p>你想知道在C++中,除了使用C++17及之后的统一初始化语法<code>return {value1, value2};</code>,还有哪些方式可以从<code>calculateValues</code>函数中返回<code>std::pair&lt;double, double&gt;</code>类型的值。</p>
<p>以下是几种常用且兼容不同C++版本的写法,我会按兼容性和简洁性排序说明:</p>
<p class="maodian"></p><h3>1. 显式调用std::pair构造函数(兼容所有C++版本)</h3>
<p>这是最基础、兼容性最好的写法,从C++98开始就支持,无需依赖任何新特性:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;utility&gt; // 必须包含std::pair的头文件

std::pair&lt;double, double&gt; calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 显式构造std::pair对象并返回
    return std::pair&lt;double, double&gt;(value1, value2);
}
</pre></div>
<p class="maodian"></p><h3>2. 使用std::make_pair(C++98+,简洁)</h3>
<p><code>std::make_pair</code>是一个模板函数,会自动推导参数的类型,无需手动指定<code>&lt;double, double&gt;</code>,代码更简洁:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;utility&gt;

std::pair&lt;double, double&gt; calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 自动推导类型,返回std::pair&lt;double, double&gt;
    return std::make_pair(value1, value2);
}
</pre></div>
<p class="maodian"></p><h3>3. C++17类模板实参推导(CTAD)</h3>
<p>C++17支持类模板实参推导,无需指定模板参数,直接用<code>std::pair{}</code>构造:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;utility&gt;

std::pair&lt;double, double&gt; calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // C++17特性:自动推导pair的模板参数
    return std::pair{value1, value2};
}
</pre></div>
<p class="maodian"></p><h3>4. 先创建对象再返回(兼容所有版本)</h3>
<p>如果需要更清晰的逻辑(比如中间需要修改值),可以先创建pair对象,再返回:</p>
<div class="jb51code"><pre class="brush:cpp;">#include &lt;utility&gt;

std::pair&lt;double, double&gt; calculateValues() {
    double value1 = 3.14;
    double value2 = 2.71;
    // 先构造对象,可在中间修改值
    std::pair&lt;double, double&gt; result(value1, value2);
    // 例如:result.first += 1.0;
    return result;
}
</pre></div>
<p class="maodian"></p><h2>总结</h2>
<ol><li><strong>兼容性优先</strong>:选择<code>std::pair&lt;double, double&gt;(value1, value2)</code>或<code>std::make_pair(value1, value2)</code>(支持C++98及以上)。</li><li><strong>C++17及以上</strong>:优先用<code>return {value1, value2}</code>(统一初始化)或<code>return std::pair{value1, value2}</code>(CTAD),代码最简洁。</li><li><strong>可读性优先</strong>:如果需要中间修改返回值,先创建pair对象再返回是更清晰的选择。</li></ol>
<p>所有写法的核心都是构造<code>std::pair&lt;double, double&gt;</code>对象并返回,只是语法形式和兼容版本不同,功能上完全等价。</p>
<p>到此这篇关于C++函数返回双值的几种方法的文章就介绍到这了,更多相关C++函数返回双值内容请搜索琼殿技术社区以前的文章或继续浏览下面的相关文章希望大家以后多多支持琼殿技术社区!</p>
                           
                            <div class="art_xg">
                              <b>您可能感兴趣的文章:</b><ul><li>C++多线程获取返回值方法详解</li><li>C++11获取线程返回值的实现代码</li><li>C++ 常量成员常量返回值详解</li><li>浅析c++函数参数和返回值</li><li>详解C++ 运算符重载中返回值的坑</li><li>C/C++ 引用作为函数的返回值方式</li><li>C++中cin的返回值问题</li><li>C++中的函数返回值问题</li></ul>
                            </div>

                        </div>
                        <!--endmain-->
頁: [1]
查看完整版本: C++函数返回双值的几种方法