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.

Concepto tipo de retorno requisito sintaxis dos versus un parámetro de plantilla.

Estoy preguntándome cómo se define std::same_as y cómo lo usamos en un concepto o requisito.

Ejemplo:

void f1() { } 
bool f2() { return true; }</p>

<p>template < typename T>
void Do( T func )
{
    if constexpr ( requires { { func() } -> std::same_as<bool>; } ) 
    {<br>
        std::cout << "La función devuelve bool " << std::endl;
    }   </p>

<pre><code>if constexpr ( requires { { func() } -> std::same_as<void>; } ) 
{   
    std::cout << "La función devuelve void " << std::endl;
}   
</code></pre>

<p>}</p>

<p>int main()
{
    Do( f1 );
    Do( f2 );
}

Eso funciona como se espera.

Pero si veo la definición de std::sameas encuentro una posible implementación:

namespace detail {
    template< class T, class U >
    concept SameHelper = std::issame_v<T, U>;
}</p>

<p>template< class T, class U >
concept same_as = detail::SameHelper<T, U> && detail::SameHelper<U, T>;

Y lo que me hace preguntarme es que veo dos argumentos de plantilla T y U en ese caso mientras que solo necesitamos escribir uno como { { func() } -> std::same_as<bool>; }.

¿Es alguna especie de magia que un { { func() } -> std::same_as<bool>; } se convierte en std::same_as<magic_return_type, bool> en ese caso?

Tags:  , ,

Answer

  1. Avatar for davy.ai

    El concepto std::same_as se define como una plantilla que toma dos argumentos de tipo T y U. Comprueba si T y U son del mismo tipo. Se puede utilizar en conceptos o requisitos para limitar los tipos de argumentos de plantilla o parámetros de función.

    En el ejemplo proporcionado, std::same_as se utiliza para comprobar el tipo de retorno de una función pasada como argumento de plantilla en la plantilla de función Do. La sintaxis { { func() } -> std::same_as<bool>; } es en realidad un atajo para { { func() } -> std::same_as<decltype(func()), bool="">; }. Es decir, se compara el tipo de retorno de func con bool.

    La implementación de std::same_as utiliza un concepto auxiliar SameHelper, que comprueba si sus dos argumentos de tipo son iguales utilizando std::is_same_v. std::same_as asegura que cualquier par de tipos T y U para los cuales SameHelper<t, u=""> y SameHelper<u, t=""> son ambos true se consideran del mismo tipo.

    Por lo tanto, no hay magia involucrada. La sintaxis -> std::same_as<bool> especifica el tipo de retorno al que se compara decltype(func()), y el concepto std::same_as en sí utiliza dos argumentos de tipo para comprobar si dos tipos son iguales.</u,></t,></decltype(func()),>

Comments are closed.