首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在std::数组上使用std::区段

在std::数组上使用std::区段
EN

Stack Overflow用户
提问于 2014-03-28 12:31:30
回答 4查看 2.3K关注 0票数 5

我有一个经过模板化的函数,我想static_assert它的类型有一个3的大小。这段代码说明了我想要做的事情,但不起作用:

代码语言:javascript
运行
复制
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 );
}
EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2014-03-28 14:06:40

这建立在艾弗尔的解决方案之上。

代码语言:javascript
运行
复制
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" );
}
票数 2
EN

Stack Overflow用户

发布于 2014-03-28 12:43:55

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

代码语言:javascript
运行
复制
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,更正/概括(实例化):

代码语言:javascript
运行
复制
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,否则只能使用lvalue。

票数 10
EN

Stack Overflow用户

发布于 2014-03-28 12:50:53

我想不出有一种方法可以同时处理这两种情况,但这就是重载的目的。

代码语言:javascript
运行
复制
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...
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/22712965

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档