通过 std::pair<std::array<std::array<u_int16_t,2>,1>,std::string>> 直接读取参考值

read values of reference direct by std::pair<std::array<std::array<u_int16_t,2>,1>,std::string>>

谁能告诉我如何直接访问各个值? 要真正使用out的指代而不是存储在临时变量PosTextfield和val之间。

#include <iostream>
#include <utility>
#include <string>
#include <cstdint>
#include <array>

using Cursor_matrix = std::array<std::array<uint16_t,2>, 1>;

void foo(const std::pair<Cursor_matrix,std::string> &out)
{
  Cursor_matrix PosTextfield;
  PosTextfield = std::get<0>(out);

  std::string val = std::get<1>(out);

  std::cout << PosTextfield[0][0] << PosTextfield[0][1] << val << "\n";
}

int main()
{
    Cursor_matrix pos;
    pos[0][0] = 1;
    pos[0][1] = 2;

    std::string str = "hello";

    std::pair<Cursor_matrix, std::string> pos_text;

    pos_text = std::make_pair(pos, str);

    return 0;
}

std::get returns 引用。您可以只存储这些引用:

const auto& PosTextfield = std::get<0>(out);
const auto& val = std::get<1>(out);

const auto& PosTextfield = out.first;
const auto& val = out.second;

或者您可以根据需要用实际类型替换 auto 关键字。 const 也可以删除,因为 auto 会推导出它,但是明确地写它会使 reader 清楚这两个引用是 non-modifiable.

这不会创建任何新对象。引用引用传递给函数的对的元素。

或者直接引用要在 out.firstout.secondstd::get<0>(out)std::get<1>(out) 中使用它们的元素。

您可以通过以下方式访问 std::pair 的元素:

pos_text.first; // Returns CursorMatrix
pos_text.second; // Returns std::string

因此您可以将 foo() 重写为:

void foo(const std::pair<Cursor_matrix, std::string>& out)
{
    std::cout << out.first[0][0] << out.first[0][1] << out.second << "\n";
}