繁体   English   中英

在std :: array上使用std :: extent

[英]Using std::extent on std::array

我有一个模板化的函数,我想static_assert它的类型大小为3。 此代码说明了我正在尝试做什么,但不起作用:

template < typename T >
void foo( T& param )
{
    // This line is the one that I need to figure out how to write
    static_assert( 3 == std::extent< T >::value, "param must have a size of 3" );
}

int main( void )
{
    int cArray[3];
    std::array< int, 3 > stdArray;

    foo( cArray );
    foo( stdArray );
}

std::extent是为内置数组定义的。 对于std::array改用std::tuple_size 我不知道两种特性都适用,但是写一个很容易:

template<typename T>
struct array_size : std::extent<T> { };

template<typename T, size_t N>
struct array_size<std::array<T,N> > : std::tuple_size<std::array<T,N> > { };

这是你的foo ,更正/概括( 实例 ):

template < typename T >
void foo( T&& param )
{
    using U = typename std::remove_cv<typename std::remove_reference<T>::type>::type;
    static_assert( 3 == array_size<U>::value, "param must have a size of 3" );
}

首选通用引用T&& param ,否则只能使用左值。

这建立在iavr的解决方案之上。

template < typename T >
void foo( T& param )
{
    static_assert( 3 == ( std::is_array< T >::value ? std::extent< T >::value : std::tuple_size< T >::value ), "param must have a size of 3" );
}

我想不出一种编写处理两者的单一函数的方法,但这就是重载的目的。

template <std::size_t N, typename T, std::size_t Bound>
void check_array_size( T (&)[Bound] )
{
    static_assert(Bound == N, "incorrect array size");
}

template <std::size_t N, typename T, std::size_t Bound>
void check_array_size( const std::array<T,Bound>& )
{
    static_assert(Bound == N, "incorrect array size");
}

template <std::size_t N>
void check_array_size( ... )
{
    static_assert(N<0, "argument is not an array");
}

template <typename T>
void foo(T& param)
{
    check_array_size<3>(param);
    // actual function implementation...
}

我怀疑你有这个错误,因为在编译时(在评估* static_assert *时) cArraystdArray的维度是未知的,并且std :: extent返回零:

http://en.cppreference.com/w/cpp/types/extent

实际上,如果将条件更改为等于零 ,则错误消失:

static_assert( std::extent< T >::value == 0, "param is not zero" );

尽管如此,正如在其他帖子中已经指出的那样, std :: extent不适用于std :: array ,仅适用于内置数组,如cArray

后OP的编辑:既然你已经修改接受一个参考,你就会有一个标准::程度上 stdArray报告3 CARRAY和0(零)。 因此,您将在编译时继续执行异常,因为stdArray的维度不是3。

暂无
暂无

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

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