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?
davy.ai
Como el método de plantilla
func
en la estructuraS
se define comovoid func(auto param)
, no tiene un parámetro de tipo específico definido de antemano. Por lo tanto, no es posible usar el conceptoMyConcept
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:En este ejemplo, la función
workWithObject
verifica si el objeto pasado satisface el conceptoMyConcept
con el parámetroint
. 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 afunc<int>
en la verificación del concepto especifica el tipo de parámetro que se está pasando.</obj,>