【问题标题】:Why doesn't the int-based access work for std::get(std::tuple)?为什么基于 int 的访问对 std::get(std::tuple) 不起作用?
【发布时间】:2019-11-18 18:54:05
【问题描述】:

Visual Studio 2017 将“std::get”下划线红色,因此程序无法编译。我该怎么做才能让它发挥作用?

一个sn-p:

std::tuple<int, int, int>t;
t = {1,1,1};
int a = 0;
int b = std::get<a>(t);

【问题讨论】:

  • 一般来说,当程序无法编译时,编译器会给你一个诊断信息。你没有收到任何消息吗?
  • “Visual Studio 2017 将“std::get”下划线红色,因此“因果关系有点不同。 VS 在代码下划线只是 IDE 的一个便利功能。要真正确定它是否编译或为什么不编译它并阅读错误消息

标签: c++ visual-studio-2017


【解决方案1】:

模板参数在编译时进行评估。您可以使用constexpr 修复您的错误,使编译器能够在编译时评估a 的值。

std::tuple<int, int, int> t;
t = {1, 1, 1};
constexpr int a = 0;
int b = std::get<a>(t);

或者,如果您的元组仅包含一种类型的元素,您可以将其替换为 std::arraystd::vector(或任何类似容器)并在运行时执行下标。

std::array<int, 3> array;
t = {1, 1, 1};
int a = 0;
int b = array[a];

【讨论】:

  • 是否有可能在编译时不知道变量值的情况下使用变量?
  • @JiW 不,如果您想将其用作模板参数的一部分,则不是。模板在编译时被实例化。这是他们设计的固有部分。
  • @JiW 有一些技巧可以让它工作,但前提是tuple 包含相同类型的元素。如果是这样,您不妨改用std::array
  • @JiW 因为tuple 元素可以有不同的类型,编译器需要知道你得到的是哪个元素,因为它需要知道类型。
【解决方案2】:

get 是一个模板,所以 a 在编译时必须是已知的,所以它应该是一个constexpr

constexpr int a = 0;

【讨论】:

    猜你喜欢
    • 2016-10-01
    • 2014-08-31
    • 1970-01-01
    • 2015-01-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-11-11
    • 1970-01-01
    相关资源
    最近更新 更多