es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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;
}
“`

Tags:  , ,

Answer

  1. Avatar for 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 como type 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 clave requires, 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.

Comments are closed.