可以在函数参数列表中多次使用函数模板的模板参数名吗?

问题描述 投票:1回答:1

我将此功能用于二次形状的二维阵列上的特定用途:rowLength == colLength

如果传递矩形数组,则函数将失败,因为实现不适合矩形形状:rowLength != colLength

仅使用一个模板可确保阵列是二次的。让编译器警告您不要使用矩形,因为参数必须等于“满足”模板系统。

我知道会有不同的解决方案,但这个完全符合我的意愿。

template <std::size_t sideLength>
void functionForQuadraticArrayOnly( const int( &arr )[ sideLength ][ sideLength ] )
{// body....}

问题:此模板用法是否正确?是未定义的行为还是其他什么?

c++ arrays templates parameter-passing 2d
1个回答
0
投票

你在这做什么是安全的。但是,了解标准中提到的一个特殊情况会很好。

请考虑以下示例:

typedef int N;
template<N X, typename N, template<N Y> class T> struct A;

这里,Xint类型的非类型模板参数,Y是与A的第二个模板参数相同类型的非类型模板参数。

请注意,Y不是int类型的非类型模板参数,因为模板参数N隐藏了Ntypedef

这是根据[basic.scope.temp]/4]说的:

模板参数名称的声明性区域嵌套在直接封闭的声明性区域中。 [注意:因此,模板参数会在封闭范围内隐藏任何具有相同名称的实体]

© www.soinside.com 2019 - 2024. All rights reserved.