为什么基于int的访问对std :: get(std :: tuple)不起作用?

时间:2019-11-18 18:54:05

标签: c++ visual-studio-2017

Visual Studio 2017下划线强调“ std :: get”为红色,因此该程序无法编译。我该怎么做才能使其正常工作?

摘要:

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

2 个答案:

答案 0 :(得分:4)

模板参数在编译时评估。您可以使用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];

答案 1 :(得分:2)

get是模板,因此在编译时必须知道a,因此它应该是constexpr

constexpr int a = 0;