¿Cuál es la razón de diseño por la cual la sobrecarga de plantillas de estructuras no está permitida en C++20?
En respuesta a mi pregunta anterior, aprendí que los conceptos de C++ 20 no permiten la sobrecarga en los argumentos de plantilla struct, por ejemplo, esto no funciona:
#include <concepts>
template <std::integral>
struct S{
};
template <std::floating_point>
struct S{
};
Para un error de clang curioso, es algo así, pero eso no importa ya que sé que el estándar de C++ no permite que este código funcione:
type constraint differs in template redeclaration
Encuentro esta forma no funcional de escribir plantillas muy natural, así que me pregunto si esto alguna vez se consideró y, de ser así, ¿por qué fue rechazado durante la estandarización?
P.D. Esto parece funcionar en C++20, pero lo encuentro mucho más feo:
“`cpp
#include <concepts>
#include <iostream>
template <typename t="">
requires std::integral<t> || std::floating_point<t>
struct S{
};
template <std::integral t="">
struct S<t>{
static constexpr char msg[] = "i";
};
template <std::floating_point t="">
struct S<t>{
static constexpr char msg[] = "fp";
};
int main() {
std::cout << S<char>::msg << std::endl;
std::cout << S<double>::msg << std::endl;
}
“`
davy.ai
Los conceptos de C++ 20 no permiten la sobrecarga en los argumentos de plantilla de estructura. El código original proporcionado en la pregunta intenta sobrecargar la estructura
S
en las restricciones del parámetro de plantilla<std::integral>
y<std::floating_point>
, lo cual no está permitido por el estándar C++20. Intentos como este darán como resultado errores comotype constraint differs in template redeclaration
.No está claro si este enfoque fue considerado oficialmente alguna vez, pero parece violar los principios fundamentales de la sobrecarga de plantillas de C++. En su lugar, la solución alternativa sugerida es utilizar la palabra clave
requires
en combinación con la especialización parcial o completa de plantillas, como se muestra en el segundo fragmento de código en la pregunta. En este enfoque, la plantilla principal está restringida a tipos enteros o de punto flotante mediante la palabra claverequires
, y se proporcionan dos especializaciones para los casos de enteros y de punto flotante. Si bien este enfoque puede funcionar, se considera más complicado y menos elegante que la intención original de la sobrecarga en las restricciones de los parámetros de plantilla.