传递给函数时限制数组的大小

时间:2010-01-29 09:34:26

标签: c++ arrays

当作为参数传递给函数时,是否有限制数组的大小?

我的意思是这样的可能吗?

/*following will lead to compile time error */

template<typename T, size_t n>=20> // or template<typename T,size_t n<=20>
void func(T (&a)[n])
{
   // do something with a

}

我希望我的数组的大小至少(或最多)n(n可以有任何值)。

例如:

n=20必须传递至少(或最多)20个元素的数组时。在C ++中有什么办法吗?

5 个答案:

答案 0 :(得分:15)

您可以简单地将要求作为静态断言 - 例如与Boosts静态断言:

template<typename T, size_t n> 
void func(T (&a)[n]) {
    BOOST_STATIC_ASSERT(n >= 20);
    // ...
}

一个基本的自定义实现(没有解决每个范围多次使用它的问题)可能如下所示:

template<bool b> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(x) StaticAssert<(x)> static_asserter 

如果您在满足要求时需要不同的行为,请使用enable_if或基于标记的专门化等内容。使用enable_if的示例:

template<class T, size_t n>
typename boost::enable_if<(n >= 20), void>::type
func(T (&a)[n]) { /* ... */ }

template<class T, size_t n>
typename boost::disable_if<(n >= 20), void>::type
func(T (&a)[n]) { /* ... */ }

答案 1 :(得分:5)

GF的答案是正确的,如果您想在编译时获得更多功能或决策点,您可能需要查看boost::mplC++ Template Metaprogramming概述了boost :: MPL的可能性及其设计方式。与MPL无关的Modern C++ design涉及利用编译时多态性的设计技术

答案 2 :(得分:3)

GF的答案非常酷,但Boost.Array不能不提。

template< typename T >
void func( boost::array< T, 20 > &a ) {

鉴于你的问题和GF的答案,看起来从T(&)[20]some_array_template<T,20>的从boost::arrayboost::array的计算免费,类型和范围安全的隐式转换在语义上是可行的,但是{{1}}没有'允许这样做。如果你有很多类似的逻辑,你可以考虑完全转移到{{1}}。如果你想要隐式转换,那么它很容易用作自己的基础。

答案 3 :(得分:-2)

您正在尝试使用模板(编译时)来了解运行时数组中有多少项。你不可能尝试这样做。

您必须依赖函数外部或函数内部的代码

答案 4 :(得分:-3)

C ++中没有这样的构造,它允许您收到编译时错误。 但我认为使用模板可以实现一个包含类似于LimitedArray类的框架,而不是基本的数组类型。