如何在编译时查询constexpr std :: tuple?

Lar*_*ars 20 c++ tuples const c++11

在C++ 0x中,可以创建一个constexpr std :: tuple,例如

#include <tuple>
constexpr int i = 10;
constexpr float f = 2.4f;
constexpr double d = -10.4;
constexpr std::tuple<int, float, double> tup(i, f, d);
Run Code Online (Sandbox Code Playgroud)

还可以在运行时查询std :: tuple,例如通过

int i2 = std::get<0>(tup);
Run Code Online (Sandbox Code Playgroud)

但是在编译时无法查询它,例如,

constexpr int i2 = std::get<0>(tup);
Run Code Online (Sandbox Code Playgroud)

将抛出编译错误(至少使用最新的g ++快照2011-02-19).

有没有其他方法在编译时查询constexpr std :: tuple?

如果没有,是否有一个概念上的原因,为什么不应该查询它?

(我知道避免使用std :: tuple,例如,通过使用boost :: mpl或boost :: fusion,但不知何故,如果不在新标准中使用元组类,这听起来是错误的......).

顺便问一下,有人知道为什么

  constexpr std::tuple<int, float, double> tup(i, f, d);
Run Code Online (Sandbox Code Playgroud)

编译好,但是

  constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4);
Run Code Online (Sandbox Code Playgroud)

不?

非常感谢提前! - 啦

Ant*_*ams 12

std::get没有标记constexpr,所以你不能用它来检索值从tuple一个constexpr背景下,即使是元组本身constexpr.

不幸的是,实现std::tuple是不透明的,所以你也不能编写自己的访问器.

  • [N3305](http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2011/n3305.html)建议为`tuple :: get`添加constexpr (9认同)