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.

Creación de un concepto para una clase no plantilla con métodos de plantilla.

Entonces, estoy tratando de crear un concepto que verifica si una estructura/clase tiene el método de plantilla void func(auto).

struct S
{
    void func(auto param)
    {
        // Hacer cosas ...
    }
};

Struct S no tiene ningún parámetro de plantilla, pero su miembro sí. Paso mi parámetro de plantilla al concepto ‘typename _Param’, pero requiere especificar este parámetro cuando uso mi concepto.

template <typename _T, typename _Param>
concept MyConcept = requires(_T&& obj, _Param&& param)
{
    {obj.func(param)};
};

// No quiero especificar 'int', no garantiza que S::func se instanciará con este parámetro.
void workWithObject(MyConcept<int> auto&& obj);

int main()
{

    S s;
    workWithObject(s);

    return 0;

}

¿Es posible utilizar MyConcept sin especificar el tipo concreto del parámetro del método?

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Como el método de plantilla func en la estructura S se define como void func(auto param), no tiene un parámetro de tipo específico definido de antemano. Por lo tanto, no es posible usar el concepto MyConcept sin especificar un tipo concreto del parámetro del método.

    Una posible solución a esto es crear una función envolvente que llame al método func con un parámetro de tipo específico y usar esa función en la verificación del concepto. Por ejemplo:

    struct S
    {
        template <typename t="">
        void func(T param)
        {
            // Hacer algo ...
        }
    };
    
    template <typename _t,="" typename="" _param="">
    concept MyConcept = requires(_T&& obj, _Param&& param)
    {
        {obj.template func<int>(param)};
    };
    
    template <typename obj="">
    void workWithObject(Obj&& obj)
    {
        if constexpr (MyConcept<obj, int="">)
        {
            // Hacer algo con obj
        }
        else
        {
            static_assert(false, "El objeto no tiene la función requerida con parámetro int");
        }
    }
    
    int main()
    {
    
        S s;
        workWithObject(s);
    
        return 0;
    
    }
    

    En este ejemplo, la función workWithObject verifica si el objeto pasado satisface el concepto MyConcept con el parámetro int. Si lo hace, la función ejecuta algún código, de lo contrario genera un error de declaración estática. Nótese que la llamada a func<int> en la verificación del concepto especifica el tipo de parámetro que se está pasando.</obj,>

Comments are closed.