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

Pra*_*rav 8 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

}
Run Code Online (Sandbox Code Playgroud)

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

例如:

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

Geo*_*che 15

您可以简单地将需求作为静态断言 - 例如使用Boosts静态断言:

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

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

template<bool b> struct StaticAssert;
template<> struct StaticAssert<true> {};
#define STATIC_ASSERT(x) StaticAssert<(x)> static_asserter 
Run Code Online (Sandbox Code Playgroud)

如果您在需要时需要不同的行为,请使用类似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]) { /* ... */ }
Run Code Online (Sandbox Code Playgroud)

  • 注意:了解大小并不会阻止您访问结束(即编译器不会检查您的数组索引). (2认同)

Has*_*yed 5

GF的答案是正确的,如果你想在编译时获得更多的功能或决策点,你可能想看一下boost :: mpl.C++模板元编程概述了boost :: MPL及其设计方式.与MPL无关的现代C++设计涉及利用编译时多态性的设计技术