¿Es posible hacer referencia a una plantilla de conversión definida por el usuario en una declaración de uso?

8

En una clase que Bhereda de clase A, es posible usar una usingdeclaración para incorporar miembros Aa B, incluso plantillas, como esta:

struct A {
    template <typename T>
    void foo();
};

struct B : private A {
    using A::foo;
};

¿Pero se puede hacer para las plantillas de conversión?

struct A {
    template <typename T>
    operator T();
};

struct B : private A {
    using A::operator /* ??? */;
};

Parece que no hay forma de referirse a la plantilla por su nombre, pero me encantaría que me demuestren que estoy equivocado u obtener alguna aclaración.

Las manzanas
fuente
1
¿Cuál es el caso de uso?
R Sahu
@RSahu Presumiblemente para heredar un constructor de conversión sin requerir herencia pública.
Ayjay
@Ayjay, si ese es el caso, entonces el uso de la privateherencia está mal concebido, en mi opinión.
R Sahu
@RSahu Ayjay está en lo correcto. Para ser más específico, quiero permitir que algunas clases Chereden B, pero Cno debería tener acceso a Alos métodos protegidos. Sin embargo, quiero que Alos métodos públicos sigan siendo públicos, incluido este operador de conversión. Sé que podría solucionar esto de varias maneras, pero preferiría evitar escribir código adicional por tan poco beneficio.
Manzanas
@ Apple, eso parece un defecto de diseño. No sé cuánto control tienes sobre estas clases. Si tiene control de lo que entra A, puede separarse Aen dos clases, una que Bpuede heredar publicy la otra private.
R Sahu

Respuestas:

3

Como solución alternativa, puede convertir a la clase base y convertirla explícitamente:

struct A {
    template <typename T>
    operator T() {
        return T{};
    }
};

struct B : private A {
    template <class T>
    operator T() {
        return static_cast<T>(static_cast<A&>(*this));
    }
};

int main() {
    A a;
    B b;
    int i_a = a;
    int i_b = b;
}
Ayjay
fuente