我将此功能用于二次形状的二维阵列上的特定用途:rowLength == colLength
如果传递矩形数组,则函数将失败,因为实现不适合矩形形状:rowLength != colLength
仅使用一个模板可确保阵列是二次的。让编译器警告您不要使用矩形,因为参数必须等于“满足”模板系统。
我知道会有不同的解决方案,但这个完全符合我的意愿。
template <std::size_t sideLength>
void functionForQuadraticArrayOnly( const int( &arr )[ sideLength ][ sideLength ] )
{// body....}
问题:此模板用法是否正确?是未定义的行为还是其他什么?
你在这做什么是安全的。但是,了解标准中提到的一个特殊情况会很好。
请考虑以下示例:
typedef int N;
template<N X, typename N, template<N Y> class T> struct A;
这里,X
是int
类型的非类型模板参数,Y
是与A
的第二个模板参数相同类型的非类型模板参数。
请注意,Y
不是int
类型的非类型模板参数,因为模板参数N
隐藏了N
的typedef
。
这是根据[basic.scope.temp]/4]
说的:
模板参数名称的声明性区域嵌套在直接封闭的声明性区域中。 [注意:因此,模板参数会在封闭范围内隐藏任何具有相同名称的实体]