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

后端 未结 3 1331
佛祖请我去吃肉
佛祖请我去吃肉 2020-12-14 18:14

In C++0x, one can create a constexpr std::tuple, e.g. like

#include 
constexpr int i = 10;
constexpr float f = 2.4f;
constexpr double d = -10.4;         


        
相关标签:
3条回答
  • 2020-12-14 18:32

    I have not yet worked with C++0x, but it seems to me that std::get() is a function, rather than expression the compiler can directly interpret. As such, it has no meaning except at runtime, after the function itself has been compiled.

    0 讨论(0)
  • 2020-12-14 18:36

    std::get is not marked constexpr, so you cannot use it to retrieve the values from a tuple in a constexpr context, even if that tuple is itself constexpr.

    Unfortunately, the implementation of std::tuple is opaque, so you cannot write your own accessors either.

    0 讨论(0)
  • 2020-12-14 18:40

    Now, std::get<> is a constexpr function. The following code compiles for me if I use gcc c++ 11 or above.

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

    Furthermore, you can generate a list of numbers at compile time by using make_index_sequence (c++14 or above) and access the tuple.

    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};
    }
    
    0 讨论(0)
提交回复
热议问题