在读Vulkan相关代码时遇到:
VulkanRendererImpl::VulkanRendererImpl(NativeWindow *window) : vulkanContext(window)
{
...
std::tie(windowFrameBufferWidth, windowFrameBufferHeight) =
vulkanContext.getWindowFrameBufferSize();
...
}
std::pair<int, int> VulkanContext::getWindowFrameBufferSize() const
{
int frameBufferWidth;
int frameBufferHeight;
OH_NativeWindow_NativeWindowHandleOpt(window, GET_BUFFER_GEOMETRY, &frameBufferHeight, &frameBufferWidth);
// LOGE("Window Frame BufferSize width is %{public}d, height is %{public}d",
frameBufferWidth, frameBufferHeight);
return std::make_pair(frameBufferWidth, frameBufferHeight);
}
下面来看下std::pair 和std::tie的区别
###1. std::pair的特点
- **定义和用途**
- `std::pair`是一个模板类,用于将两个不同类型(也可以是相同类型)的值组合成一个单一的对象。它提供了一种方便的方式来同时处理两个相关的值,就像一个有两个成员的简单结构体。例如,在一个函数中需要返回两个值时,可以使用`std::pair`来封装这两个值并一起返回。
- 示例代码如下:
#include <iostream>
#include <utility>
std::pair<int, std::string> getPair() {
return std::make_pair(42, "answer");
}
int main() {
std::pair<int, std::string> p = getPair();
std::cout << p.first << " " << p.second << std::endl;
return 0;
}
-
在这个例子中,
getPair函数返回一个std::pair,其中包含一个整数和一个字符串。在main函数中,可以通过first和second成员分别访问这两个值。 -
存储和访问方式
-
std::pair对象将两个值存储在其内部,访问成员时使用first和second这两个公共成员变量。这两个成员变量的类型是在定义std::pair时指定的两个模板参数的类型。例如,对于std::pair<int, double>,first的类型是int,second的类型是double。
-
###2. std::tie的特点
- **定义和用途**
- `std::tie`是一个函数模板,主要用于解包(unpack)一个`std::tuple`(或类似结构,包括`std::pair`)中的元素。它创建了一个左值引用的元组,用于将已有的变量绑定到`tuple`(或`pair`)中的元素上,从而方便地获取`tuple`(或`pair`)中的值并赋值给这些变量。
- 示例代码如下:
#include <iostream>
#include <utility>
int main() {
std::pair<int, std::string> p(42, "answer");
int num;
std::string str;
std::tie(num, str) = p;
std::cout << num << " " << str << std::endl;
return 0;
}
-
在这个例子中,
std::tie(num, str)创建了一个引用元组,然后通过= p将p中的值解包并赋值给num和str。 -
与
std::pair结合使用的场景-
当需要将
std::pair中的值提取到多个变量中时,std::tie特别有用。特别是在函数返回std::pair,而调用者想要分别获取这两个值并存储到不同的变量中时。例如,在一个函数返回一个包含错误码和错误消息的std::pair时,调用者可以使用std::tie来分别获取这两个值并进行相应的处理。
-
###3. 主要区别
- **数据结构与功能重点**
- `std::pair`是一个用于组合两个值的数据结构,重点在于将两个值作为一个整体来存储和传递。它提供了一种简单的方式来表示一对相关的值,并且可以在很多场景下作为函数返回值或者作为容器(如`std::map`中的元素类型)。
- `std::tie`主要用于解包操作,它本身不是一个数据存储结构。它的功能是将变量绑定到一个`tuple`或`pair`中的元素上,以便从这些数据结构中获取值并赋值给变量,是一种方便的解包机制。
- **使用方式和场景差异**
- 使用`std::pair`时,更多的是在创建、存储和传递一对相关的值。例如,在关联容器中存储键值对,或者在函数中返回多个相关的值。
- `std::tie`则主要在需要解包`pair`(或`tuple`)中的值到其他变量时使用。例如,在处理函数返回的`pair`时,将其中的值提取到不同的变量中,以便分别进行处理。