tipos que premisas parametros los fundamentar fuerza ejemplos conclusiones como argumentos argumento argumentacion aceptabilidad c++ partial-specialization design-rationale

c++ - que - ¿Por qué no se permite la especialización parcial en un argumento sin tipo para utilizar parámetros de plantilla anidados?



tipos de argumentacion (2)

Tengo este código

template<int N, bool C = true> struct A; template<int N> struct A<N, !(N % 5)> { /* ... */ }; // should work A<25> a;

Es decir, para los números N que son divisibles por 5 , el compilador debe usar la especialización parcial. Pero el compilador no aceptará esa especialización parcial, porque el Estándar requiere que rechace dicho código cuando un argumento sin tipo de una especialización parcial hace referencia a un parámetro y no es simplemente un parámetro (como, A<N, N> sería válido). Pero, ¿cuál es el motivo de hacerlo?

Tenga en cuenta que simplemente puedo cambiar mi código a un ejemplo más prolijo y es válido

template<bool> struct wrap; template<int N, typename = wrap<true> > struct A; template<int N> struct A<N, wrap<!(N % 5)> > { /* ... */ }; // should work A<25> a;

Esto está bien porque ya no es un parámetro sin tipo. ¿Pero cuál es la razón por la cual la especificación prohíbe la especialización parcial más directa?


Creo que mucho de esto es histórico. Los parámetros de plantilla sin tipo no se permitieron originalmente en absoluto. Cuando se agregaron, hubo muchas limitaciones. Como las personas probaron diferentes posibilidades y confirmaron que no causaban problemas, se eliminaron algunas de las limitaciones.

Algunas de esas limitaciones originales permanecen sin ninguna razón particular más allá del hecho de que nadie se molestó en trabajar para cambiarlas. Al igual que allí, muchos de ellos se pueden solucionar, por lo que su eliminación generalmente no causaría ninguna dificultad particular. En general, todo se reduce a la pregunta de si alguien se preocupó lo suficiente acerca de este caso particular como para escribir un artículo al respecto.


La especialización parcial requiere que el argumento de la plantilla sin tipo se pueda resolver en tiempo de compilación.

En este punto

template<int N> struct A<N, !(N % 5)> { /* ... */ };

N es una variable que puede tomar más de un valor y el compilador no puede calcular N % 5 con certeza.

Tu ejemplo ejemplifica un uso

A<25> a;

pero también podrías tener

A<25> a1; A<15> a2;

¿Cómo elige el compilador un valor para N en este escenario? No puede y tiene que rechazar el código.