繁体   English   中英

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

[英]How to query a constexpr std::tuple at compile time?

在 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);

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

int i2 = std::get<0>(tup);

但是不可能在编译时查询它,例如,

constexpr int i2 = std::get<0>(tup);

将抛出一个编译错误(至少对于最新的 g++ 快照 2011-02-19)。

还有其他方法可以在编译时查询 constexpr std::tuple 吗?

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

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

顺便说一下,有谁知道为什么

  constexpr std::tuple<int, float, double> tup(i, f, d);

编译正常,但是

  constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4);

不是?

非常感谢! -拉斯

std::get未标记为constexpr ,因此您不能使用它从constexpr上下文中的tuple检索值,即使该元组本身就是constexpr

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

现在, std::get<> 是一个 constexpr 函数。 如果我使用 gcc c++ 11 或更高版本,以下代码将为我编译。

constexpr int i2 = std::get<0>(tup);
constexpr std::tuple<int, float, double> tup(10, 2.4f, -10.4);

此外,您可以在编译时使用 make_index_sequence(c++14 或更高版本)生成数字列表并访问元组。

constexpr auto size = std::tuple_size<decltype(tup)>::value;
for_sequence(std::make_index_sequence<size>{}, [&](auto i){
        constexpr auto property = std::get<i>(tup);
        std::cout<<property<<std::endl;
});

template <typename T, T... S, typename F>
constexpr void for_sequence(std::integer_sequence<T, S...>, F&& f) {
    using unpack_t = int[];
    (void)unpack_t{(static_cast<void>(f(std::integral_constant<T, S>{})), 0)..., 0};
}

此问题已在 c++17 中修复。但是如果您想将元组作为参数传递给 constexpr function,我强烈建议您阅读这篇文章https://mpark.github.io/programming/2017/05/26/constexpr-功能参数/

我还没有使用过 C++0x,但在我看来 std::get() 是一个函数,而不是编译器可以直接解释的表达式。 因此,除了在运行时,在函数本身被编译之后,它没有任何意义。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM