1. 程式人生 > >【C++】C++ 多返回值函式

【C++】C++ 多返回值函式

在一些複雜的應用中,使用多返回值的函式更加方便。從使用一個結構體到採用c++ 11新特性tuple類模板,在c++中有多種方式實現這一需要。

通過返回一個物件來實現多返回值函式,這個方案比較直觀,但在很多情況下有些小題大做了。首先,你必須去宣告一個結構體。結構體常常要對使用者開放許可權,因此你必須將結構體成員暴露在外部的世界。其次,你還要為結構體構建例項,儘管這一活動沒人喜歡去做。

幸運的是,如果你的函式僅僅需要兩個返回值,std::pair可以很好地實現。通常make_pair被用來構建pair的例項,pair例項中兩個元素可以分別地使用first和second成員來訪問。使用下面的程式碼來說明pair方法:

std::pair<std::string , int> findPerson() {
    return std::make_pair("Joe Sixpack", 42);
}
int main(int, char**) {
    std::pair< std::string, int> person = findPerson();
    std::cout < < "Name: " << person.first << std::endl;
    std::cout << "Age: " << person.second << std::endl;
    return 0;
}

 可是當我們需要函式返回值的個數多於兩個的時候需要怎樣做呢?顯然std::pair不適合實現函式返回值多於2個的情況,我們可以使用Boost Tuple庫中的boost::tuple實現。如果你已經正在使用std::pair,那麼熟練使用boost::tuple將是小菜一碟。使用make_tuple來建立一個tuple物件,它的元素可以使用get<n>成員函式來獲取,n表示tuple物件中元素的下表。

#include <boost /tuple/tuple.hpp>
boost::tuple<std::string , std::string, int> findPerson() {
    return boost::make_tuple("Joe", "Sixpack", 42);
}
int main(int, char**) {
    boost::tuple< std::string , std::string, int> person = findPerson();
    std::cout < < "Name: " << person.get< 0>() < < " "
        << person.get< 1>() < < std::endl;
    std::cout << "Age: " << person.get< 2>() < < std::endl;
    return 0;
}
這裡我們再介紹一下std::tie,它在拆解tuple物件時更加方便實用(類似於ES6 destructuring)。它可以很好地替代get來獲取元素,下面的程式碼片段展示了它的使用方法:
int main(int, char**) {
    std::string first_name, last_name;
    int age;
    std::tie(first_name, last_name, age) = findPerson();
    std::cout < < "Name: " << first_name << std::endl;
    return 0;
}

原文連結:https://dzone.com/articles/c-multiple-return-values

原文作者:Ariya Hidayat


相關推薦

C++C++ 返回函式

在一些複雜的應用中,使用多返回值的函式更加方便。從使用一個結構體到採用c++ 11新特性tuple類模板,在c++中有多種方式實現這一需要。 通過返回一個物件來實現多返回值函式,這個方案比較直觀,但在很多情況下有些小題大做了。首先,你必須去宣告一個結構體。結構體常常要對使

C++c++單繼承、繼承、菱形繼承記憶體佈局(虛擬函式表結構)

單繼承:只有一個基類和一個派生類 class Base { public: virtual void fun1() { cout << "Base::func1()" << endl;

c++c++中重載輸出操作符,為什麽要返回引用

不返回 定義 類型 AS 標準 操作符 連續 新的 輸出 針對:ostream & operator <<(ostream & os, const ClassType &object) 說明幾點: 1.第一個形參為對ostream對象的引

3、C++繼承/

    面向物件的三個基本特徵是:封裝、繼承、多型。其中,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件已存在的程式碼模組(類);它們的目的都是為了——程式碼重用。而多型則是為了實現另一個目的——介面重用!     封裝:將一類事物所共有的屬性和行為方法進行總結,封裝在一個類中

1、C++類&物件/建構函式/拷貝建構函式/操作符過載/解構函式

一、C++類 & 物件     C++ 在 C 語言的基礎上增加了面向物件程式設計,C++ 支援面向物件程式設計。類是 C++ 的核心特性,通常被稱為使用者定義的型別。     類用於指定物件的形式,它包含了資料表示法和用於處理資料的方法。類中的資料和方法稱為類的成員。函式在

轉載c++右引用以及使用

轉自:https://www.cnblogs.com/likaiming/p/9045642.html 前幾天看了一篇文章《4行程式碼看看右值引用》 覺得寫得不錯,但是覺得右值引用的內容還有很多可以去挖掘學習,所以總結了一下,希望能對右值引用有一個更加深層次的認識 一、幾個基本概念 1.

C++虛擬函式

引言 C++中的虛擬函式的作用主要是實現了多型的機制。關於多型,簡而言之就是用父類型別的指標指向其子類的例項,然後通過父類的指標呼叫實際子類的成員函式。這種技術可以讓父類的指標有“多種形態”,這是一種泛型技術。所謂泛型技術,說白了就是試圖使用不變的程式碼來實現可變的演算法。比如:模板技術,RTTI技術,虛擬函

轉載++C/C++錯誤分析errno,perror,strerror和GetLastError()函數返回的錯誤代碼的意義

urn ali blog 查看 情況下 常見 ast mos 運行 本文是上一篇“fopen返回0(空指針NULL)且GetLastError是0”的側面回應。聽趕來多麽地正確和不容置疑,返回NULL時調用GetLastError來看看報錯啊,但當時卻返回了0,大家都覺得系

轉載C++ getline函式用法

https://www.cnblogs.com/xiaofeiIDO/p/8574042.html 摘要: 通過getline()函式一個小小的例項,那麼把getline()函式作為while的判斷語句會怎麼樣的呢! 就分析一下while(getline(cin,line)) (注意:這裡預設回車符停

筆記C++ 特俗函式

  1.struct option介紹 在c程式應用程式執行的時,常常配有一些引數,如果引數少我們可以使用arvg,arvc來實現,如果引數很多並且需要傳入引數複雜我們可以使用strcut option 來實現。 struct option { /*name表示的是長引數名*

C#List權重排序

List.Sort((x, y) => -x.CompareTo(y));  倒序排序 List.Sort((x, y) => x.CompareTo(y));  正序排序   如果需要比較多個條件,比如裝備排序:橙>紫>藍,品質越高

C++c++中的六個預設函式——解構函式

解構函式(不能過載,沒有引數,一個類只能有一個解構函式。如果沒定義,編譯器會自動生成一個) 解構函式:建立物件時系統會自動呼叫建構函式進行初始化工作,同樣,銷燬物件時系統也會自動呼叫一個函式來進行清理工作。 解構函式(Destructor)也是一種特殊的成員函式,沒有返回值,不需要

C++c++中的六個預設函式——建構函式

類的6個預設的成員函式包括: 建構函式、解構函式、拷貝建構函式、賦值運算子過載函式、取地址操作符過載、const修飾的取地址操作符過載。(但是重點講前四個)   建構函式(可以過載) 在C++中,有一種特殊的成員函式,它的名字和類名相同,沒有返回值,不需要使用者顯

C++類的預設成員函式

1.建構函式 2.拷貝建構函式 3.解構函式、 4.運算子過載---實現一個日期計算器 c++類有6個預設成員函式:建構函式,拷貝建構函式,解構函式,賦值操作符過載。取地址操作符過載,const修飾的取地址操作符過載。其中前四個預設成員函式是我們重點研究物件

C++C語言static變數和函式

使用 static 修飾的變數或函式的作用域僅限於當前模組,對其他模組隱藏,利用這一特性可以在不同的檔案中定義同名的變數或函式,而不必擔心命名衝突。 static 除了可以修飾全域性變數,還可以修飾區域性變數,被 static 修飾的變數統稱為靜態變數(Static

C++C++函式過載過程中的二義性和型別轉換

例如函式形參的型別是int,呼叫函式時卻將short型別的資料交給了它,編譯器就需要先將short型別轉換為int型別才能匹配成功。 注意,型別提升和型別轉換不是一碼事!型別提升是積極的,是為了更加高效地利用計算機硬體,不會導致資料丟失或精度降低;而型別轉換是不得已

C++C++封裝、繼承、型小結

轉載地址:http://blog.csdn.net/ruyue_ruyue/article/details/8211809 面向物件的三個基本特徵 面向物件的三個基本特徵是:封裝、繼承、多型。其中,封裝可以隱藏實現細節,使得程式碼模組化;繼承可以擴充套件

Swift4(5) 函式基本使用 | 可變引數 | inout引用傳遞 | 函式型別返回 | 函式巢狀

函式基本使用 關鍵字:func func hello(name:String) ->String { let result = "Hello,"+name return res

C指標陣列作main函式的形參

指標陣列的重要應用是作為main函式的形參,在以往的程式中,main函式的第一行一般形式為: int main()或  int main(void) 括號中為空或為“void”,表示main函式沒有引數,呼叫main函式時不必給出引數。 這是一般程式常採用的格式。實

luaC 函式中呼叫Lua函式時,對於lua_pcall使用的困惑

最近在學習使用Lua,也通過基本的語法知識完成了公司的一個關於配置檔案引數合法性檢查的小任務。雖然任務完成了,但對於一些函式的呼叫目的還是搞不明白,這兩天再次重看了Manual Reference,稍微梳理出了一點眉目,記錄在此。 首先看一段小小小程式 fun