Computer >> Máy Tính >  >> Lập trình >> C ++

Trả về nhiều giá trị từ một hàm bằng Tuple và Ghép nối trong C ++

Trong C hoặc C ++, chúng ta không thể trả về nhiều hơn một giá trị từ một hàm. Để trả về nhiều giá trị, chúng ta phải cung cấp tham số đầu ra với hàm. Ở đây chúng ta sẽ thấy một cách tiếp cận khác để trả về nhiều giá trị từ một hàm bằng cách sử dụng tuple và ghép nối STL trong C ++.

Tuple là một đối tượng có khả năng chứa một tập hợp các phần tử, trong đó mỗi phần tử có thể thuộc các loại khác nhau.

Cặp có thể tạo một tập hợp hai giá trị, có thể thuộc các loại khác nhau. Về cơ bản, cặp này là một loại tuple đặc biệt, nơi chỉ cho phép hai giá trị.

Hãy để chúng tôi xem một ví dụ, nơi chúng tôi sẽ thấy cách tuple và các cặp đang hoạt động.

Ví dụ

#include<iostream>
#include<tuple>
#include<utility>
using namespace std;
tuple<int, string, char> my_function_tuple(int x, string y) {
   return make_tuple(x, y, 'A'); // make tuples with the values and return
}
std::pair<int, string> my_function_pair(int x, string y) {
   return std::make_pair(x, y); // make pair with the values and return
}
main() {
   int a;
   string b;
   char c;
   tie(a, b, c) = my_function_tuple(48, "Hello"); //unpack tuple
   pair<int, string> my_pair = my_function_pair(89,"World"); //get pair from function
   cout << "Values in tuple: ";
   cout << "(" << a << ", " << b << ", " << c << ")" << endl;
   cout << "Values in Pair: ";
   cout << "(" << my_pair.first << ", " << my_pair.second << ")" << endl;
}

Đầu ra

Values in tuple: (48, Hello, A)
Values in Pair: (89, World)

Vậy vấn đề trong chương trình trên là gì? NULL thường được định nghĩa là (void *) 0. Chúng tôi được phép chuyển đổi NULL sang kiểu tích phân. Vì vậy, lệnh gọi hàm của my_func (NULL) là không rõ ràng.

Nếu chúng ta sử dụng nullptr thay cho NULL, chúng ta sẽ nhận được kết quả như bên dưới -

Ví dụ

#include<iostream>
using namespace std;
int my_func(int N) { //function with integer type parameter
   cout << "Calling function my_func(int)";
}
int my_func(char* str) { //overloaded function with char* type parameter
   cout << "calling function my_func(char *)";
}
int main() {
   my_func(nullptr); //it will call my_func(char *), but will generate compiler error
}

Đầu ra

calling function my_func(char *)

Chúng ta có thể sử dụng nullptr ở tất cả những nơi mà NULL được mong đợi. Giống như NULL, nullptr cũng có thể được chuyển đổi thành bất kỳ kiểu con trỏ nào. Nhưng điều này không hoàn toàn có thể chuyển đổi thành kiểu tích phân như NULL.