C++函數(shù)返回雙值的幾種方法
在C++結(jié)合Qt的開(kāi)發(fā)環(huán)境中,若要讓函數(shù)返回兩個(gè)double類(lèi)型的值,有不少合適的數(shù)據(jù)類(lèi)型可供選擇。下面為你詳細(xì)介紹幾種常見(jiàn)的方案及其適用情形:
1.std::pair<double, double>
這是C++標(biāo)準(zhǔn)庫(kù)提供的模板類(lèi),其主要功能就是將兩個(gè)值組合成一個(gè)對(duì)象。它的優(yōu)勢(shì)在于使用起來(lái)非常簡(jiǎn)便,而且無(wú)需引入額外的依賴(lài)。
#include <utility>
std::pair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
return {value1, value2}; // C++17及之后的統(tǒng)一初始化語(yǔ)法
}
// 調(diào)用示例
auto result = calculateValues();
double a = result.first;
double b = result.second;
2.QPair<double, double>
QPair是Qt框架提供的類(lèi),它和std::pair的功能類(lèi)似。不過(guò),它能更好地和Qt的元對(duì)象系統(tǒng)以及序列化機(jī)制相融合。
#include <QPair>
QPair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
return qMakePair(value1, value2);
}
// 調(diào)用示例
QPair<double, double> result = calculateValues();
double a = result.first;
double b = result.second;
3. 自定義結(jié)構(gòu)體(struct)
當(dāng)返回值有具體的業(yè)務(wù)含義時(shí),建議使用自定義結(jié)構(gòu)體。這樣可以讓代碼的可讀性更強(qiáng),維護(hù)起來(lái)也更加方便。
struct MyResult {
double firstValue;
double secondValue;
};
MyResult calculateValues() {
MyResult result;
result.firstValue = 3.14;
result.secondValue = 2.71;
return result;
}
// 調(diào)用示例
MyResult result = calculateValues();
double a = result.firstValue;
double b = result.secondValue;
4.QPointF
要是返回的兩個(gè)值代表二維平面上的坐標(biāo)點(diǎn),使用QPointF是個(gè)不錯(cuò)的選擇。它還提供了一些幾何操作函數(shù)。
#include <QPointF>
QPointF calculatePoint() {
double x = 3.14;
double y = 2.71;
return QPointF(x, y);
}
// 調(diào)用示例
QPointF point = calculatePoint();
double x = point.x();
double y = point.y();
選擇建議
- 若返回值僅用于臨時(shí)處理,不具備特定業(yè)務(wù)意義,可優(yōu)先考慮
std::pair或QPair。 - 若返回值代表坐標(biāo)、尺寸等具有幾何意義的值,
QPointF或QSizeF是很好的選擇。 - 若返回值有明確的業(yè)務(wù)含義,像“價(jià)格和數(shù)量”“寬度和高度”等,建議使用自定義結(jié)構(gòu)體。
在Qt項(xiàng)目里,以上幾種方案都能正常使用。不過(guò),使用Qt特定的類(lèi)型(如QPair、QPointF)可以讓代碼更好地融入Qt的生態(tài)系統(tǒng)。
5.std::pair額外說(shuō)明
你想知道在C++中,除了使用C++17及之后的統(tǒng)一初始化語(yǔ)法return {value1, value2};,還有哪些方式可以從calculateValues函數(shù)中返回std::pair<double, double>類(lèi)型的值。
以下是幾種常用且兼容不同C++版本的寫(xiě)法,我會(huì)按兼容性和簡(jiǎn)潔性排序說(shuō)明:
1. 顯式調(diào)用std::pair構(gòu)造函數(shù)(兼容所有C++版本)
這是最基礎(chǔ)、兼容性最好的寫(xiě)法,從C++98開(kāi)始就支持,無(wú)需依賴(lài)任何新特性:
#include <utility> // 必須包含std::pair的頭文件
std::pair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
// 顯式構(gòu)造std::pair對(duì)象并返回
return std::pair<double, double>(value1, value2);
}
2. 使用std::make_pair(C++98+,簡(jiǎn)潔)
std::make_pair是一個(gè)模板函數(shù),會(huì)自動(dòng)推導(dǎo)參數(shù)的類(lèi)型,無(wú)需手動(dòng)指定<double, double>,代碼更簡(jiǎn)潔:
#include <utility>
std::pair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
// 自動(dòng)推導(dǎo)類(lèi)型,返回std::pair<double, double>
return std::make_pair(value1, value2);
}
3. C++17類(lèi)模板實(shí)參推導(dǎo)(CTAD)
C++17支持類(lèi)模板實(shí)參推導(dǎo),無(wú)需指定模板參數(shù),直接用std::pair{}構(gòu)造:
#include <utility>
std::pair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
// C++17特性:自動(dòng)推導(dǎo)pair的模板參數(shù)
return std::pair{value1, value2};
}
4. 先創(chuàng)建對(duì)象再返回(兼容所有版本)
如果需要更清晰的邏輯(比如中間需要修改值),可以先創(chuàng)建pair對(duì)象,再返回:
#include <utility>
std::pair<double, double> calculateValues() {
double value1 = 3.14;
double value2 = 2.71;
// 先構(gòu)造對(duì)象,可在中間修改值
std::pair<double, double> result(value1, value2);
// 例如:result.first += 1.0;
return result;
}
總結(jié)
- 兼容性?xún)?yōu)先:選擇
std::pair<double, double>(value1, value2)或std::make_pair(value1, value2)(支持C++98及以上)。 - C++17及以上:優(yōu)先用
return {value1, value2}(統(tǒng)一初始化)或return std::pair{value1, value2}(CTAD),代碼最簡(jiǎn)潔。 - 可讀性?xún)?yōu)先:如果需要中間修改返回值,先創(chuàng)建pair對(duì)象再返回是更清晰的選擇。
所有寫(xiě)法的核心都是構(gòu)造std::pair<double, double>對(duì)象并返回,只是語(yǔ)法形式和兼容版本不同,功能上完全等價(jià)。
到此這篇關(guān)于C++函數(shù)返回雙值的幾種方法的文章就介紹到這了,更多相關(guān)C++函數(shù)返回雙值內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
QT通過(guò)C++線程池運(yùn)行Lambda自定義函數(shù)流程詳解
最近在接觸公司的一個(gè)QT桌面項(xiàng)目,其中里面有一個(gè)模塊是使用線程池去運(yùn)行自定義函數(shù)的,自己潛心研究那個(gè)線程池代碼一天,發(fā)現(xiàn)研究不透,看不懂,里面幾乎都是使用C++11的新特性進(jìn)行編寫(xiě)2022-10-10
C語(yǔ)言中常見(jiàn)的六種動(dòng)態(tài)內(nèi)存錯(cuò)誤總結(jié)
學(xué)習(xí)過(guò)C語(yǔ)言中的動(dòng)態(tài)內(nèi)存函數(shù),例如【malloc】、【calloc】、【realloc】、【free】,那它們?cè)谑褂玫倪^(guò)程中會(huì)碰到哪些問(wèn)題呢,本本文我們一起來(lái)探討下,感興趣的朋友跟著小編一起來(lái)看看吧2023-11-11
C++ 關(guān)于MFC List Control 控件的總結(jié)
這篇文章主要介紹了C++ 關(guān)于MFC List Control 控件的總結(jié)的相關(guān)資料,十分的詳細(xì),有需要的朋友可以參考下2015-06-06
C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn)
工廠方法模式是一個(gè)創(chuàng)建型設(shè)計(jì)模式,通過(guò)定義一個(gè)創(chuàng)建對(duì)象的接口,讓其子類(lèi)決定實(shí)例化哪一個(gè)工廠類(lèi),這篇文章主要給大家介紹了關(guān)于C++設(shè)計(jì)模式之工廠方法模式的實(shí)現(xiàn)及優(yōu)缺點(diǎn),需要的朋友可以參考下2021-06-06
詳解C++中的函數(shù)調(diào)用和下標(biāo)以及成員訪問(wèn)運(yùn)算符的重載
這篇文章主要介紹了詳解C++中的函數(shù)調(diào)用和下標(biāo)以及成員訪問(wèn)運(yùn)算符,講到了這些二元運(yùn)算符使用的語(yǔ)法及重載,需要的朋友可以參考下2016-01-01
C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文)
這篇文章主要介紹了C/C++雜記 虛函數(shù)的實(shí)現(xiàn)的基本原理(圖文),需要的朋友可以參考下2016-06-06

