Getting the number of elements in std::array at compile time

前端 未结 4 958
礼貌的吻别
礼貌的吻别 2021-02-06 23:45

Is the following a valid C++ code, and why not?

std::array a1;
std::array a2;

It doesn\'t compile

相关标签:
4条回答
  • 2021-02-07 00:00

    array<T>::size() is constexpr, but you can't use it in this way because a1 isn't a constexpr value. Additionally, it can't be constexpr because string isn't a literal type.

    However, you can work around this if you want, by deducing the size_t template parameter. Example:

    #include <string>
    #include <array>
    #include <iostream>
    using namespace std;
    
    template<typename>
    struct array_size;
    template<typename T, size_t N>
    struct array_size<array<T,N> > {
        static size_t const size = N;
    };
    
    array<string, 42> a1;
    array<string, array_size<decltype(a1)>::size> a2;
    
    int main() {
        cout << a2.size() << endl;
    }
    
    0 讨论(0)
  • 2021-02-07 00:00

    It is not static but it is a constexpr http://www.cplusplus.com/reference/array/array/size/
    EDIT: this may not be a bug, take a look at this Error using a constexpr as a template parameter within the same class

    0 讨论(0)
  • 2021-02-07 00:19

    std::array::size is actually required to be constexpr per § 23.3.2.1 of the C++11 standard:

    23.3.2.4 array::size [array.size]  
    template <class T, size_t N> constexpr size_type array<T,N>::size() noexcept;  
    Returns: N
    

    I'm guessing this just slipped past whoever implemented it in GCC.


    After testing, this works:

    std::array<int, 42> a1;
    std::array<int, a1.size()> a2;
    

    This may actually have something to do with std::string not being a valid constexpr type to make compile-time instances of, whereas int is.

    0 讨论(0)
  • 2021-02-07 00:21

    You can use the same template-inference method as has always been used for C++98 array bound detection.

    template<size_t N, typename T>
    constant_integer<N> array_size( const std::array<T, N>& );
    
    • Demo: http://ideone.com/R4k1vG

    Make a nice macro wrapper and enjoy!

    Many variations are also possible, such as:

    • http://ideone.com/Hn46ei
    0 讨论(0)
提交回复
热议问题