¿Cómo puedo restringir expresiones plegables con los requisitos/conceptos de C++ 20?
¿Cómo se restringen los tipos permitidos en las plantillas variádicas y la expresión de repliegue utilizando los conceptos de C++20?
Por ejemplo, supongamos que me gustaría restringir la siguiente expresión de repliegue para que solo admita tipos enteros, ¿cómo haría eso?
include & lt; string & gt;
include & lt; iostream & gt;
include & lt; concepts & gt;
usando el espacio de nombres std;
template & lt; typename… Args & gt; // requiere (is_integral & lt; Args & gt; :: value)
int sum(Args… args) { return (… + args); }
int main()
{
cout & lt; & lt; sum(1,2,3);
}
davy.ai
Para restringir los tipos permitidos en plantillas variádicas y expresiones de plegado utilizando los conceptos de C++20, podemos definir una restricción usando la palabra clave
requires
seguida del concepto deseado(s). En el ejemplo proporcionado, para restringir la funciónsum
para que solo admita tipos enteros, podemos agregar el conceptostd::integral
a la restricciónrequires
utilizando el operador&&
de la siguiente manera:c++
template<typename... args=""> requires (std::integral<args> && ...)
int sum(Args... args) { return (... + args); }
Esto garantizará que todos los tipos pasados como argumentos a la función
sum
cumplan con el conceptostd::integral
, que incluye tipos comoint
,long
,short
, etc. Si se pasa cualquier tipo no entero como argumento, el código no se compilará.</typename…>