当作为参数传递给函数时,是否有限制数组的大小?
我的意思是这样的可能吗?
/*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 ++中有什么办法吗?
答案 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::mpl。 C++ 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::array
到boost::array
的计算免费,类型和范围安全的隐式转换在语义上是可行的,但是{{1}}没有'允许这样做。如果你有很多类似的逻辑,你可以考虑完全转移到{{1}}。如果你想要隐式转换,那么它很容易用作自己的基础。
答案 3 :(得分:-2)
您正在尝试使用模板(编译时)来了解运行时数组中有多少项。你不可能尝试这样做。
您必须依赖函数外部或函数内部的代码
答案 4 :(得分:-3)
C ++中没有这样的构造,它允许您收到编译时错误。 但我认为使用模板可以实现一个包含类似于LimitedArray类的框架,而不是基本的数组类型。