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.

¿Es posible determinar si una clase tiene un método de plantilla de una firma determinada?

Sé que es posible determinar si una clase tiene cierto miembro con SFINAE. Pero ¿hay alguna manera de determinar si una clase tiene cierto método de plantilla? Por ejemplo:

class Foo {
public:
template
int method(std::vector vec);
};

También sé que puedes detectar instancias particulares de una plantilla de miembro (es decir, para T especificado). ¿Pero me pregunto si es posible hacerlo con T arbitrario?

EDITAR:

Para ser más precisos, por qué necesito que T sea un tipo arbitrario, consideremos el siguiente ejemplo:

class Foo {
public:
    template<typename derived="">
    void func(Eigen::ArrayBase<derived> &&arr)
    {
        // implementation 
    }
};

using Matrix = Eigen::Array<double, -1,="" -1,="" eigen::rowmajor="">;

Matrix m1(10, 10);

Foo foo;

foo.func(m1.row(1));
foo.func(m1.col(1));
foo.func(m1.row(2).segment(2, 4));

func se puede llamar con cualquiera de esas expresiones, pero Derived dentro de esas llamadas será diferente:

1) Eigen::Block<><double, -1,=”” -1,=”” 1=””>, 1, -1, true>
2) Eigen::Block<><double, -1,=”” -1,=”” 1=””>, -1, 1, false>
3) Eigen::Block<><><double, -1,=”” -1,=”” 1=””>, 1, -1, true>, 1, -1, false></double,></double,></double,></double,>

Tags:  , ,

Answer

  1. Avatar for davy.ai

    ¿Hay alguna manera de detectar que ‘Foo’ tiene ‘func’ con ‘Derived’ arbitrario?

    Sí, es posible determinar si una clase tiene un cierto método de plantilla con ‘T’ arbitraria. Esto se puede hacer utilizando la técnica SFINAE. SFINAE significa “Substitution Failure Is Not An Error”, y es una forma de usar el sistema de tipos del compilador para detectar la presencia de ciertos métodos de plantilla.

    Por ejemplo, puedes usar SFINAE para detectar la presencia de un método ‘func’ en la clase ‘Foo’, como se muestra en el ejemplo anterior. El compilador intentará sustituir el tipo ‘Derived’ en el método ‘func’, y si falla, el compilador no informará un error. Esto te permite detectar la presencia del método ‘func’ con tipos ‘Derived’ arbitrarios.

Comments are closed.