É possível consultar um modelo de conversão definido pelo usuário em uma declaração de uso?

8

Em uma classe Bherdar de classe A, é possível usar uma usingdeclaração para trazer membros de Adentro B, até mesmo modelos, como este:

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

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

Mas isso pode ser feito para modelos de conversão?

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

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

Parece não haver maneira de se referir ao modelo pelo nome, mas eu gostaria de ser provado errado ou obter algum esclarecimento.

Maçãs
fonte
1
Qual é o caso de uso?
R: Sahu
@RSahu Presumivelmente, herdar um construtor de conversão sem exigir herança pública.
21419 Ayjay
@ Ayjay, se for esse o caso, o uso da privateherança é mal concebido, IMO.
R Sahu
@RSahu Ayjay está correto. Para ser mais específico, desejo permitir que alguma classe Cseja herdada B, mas Cnão deveria ter acesso aos Amétodos protegidos. No entanto, quero que Aos métodos públicos permaneçam públicos, incluindo esse operador de conversão. Sei que poderia contornar isso de algumas maneiras, mas prefiro evitar escrever código extra para obter tão pouco benefício.
Maçãs
@ Apple, isso parece uma falha de design. Não sei quanto controle você tem sobre essas classes. Se você tem controle sobre o que entra A, pode se separar Aem duas classes - uma que Bpode herdar publice a outra private.
R Sahu

Respostas:

3

Como solução alternativa, você pode converter para a classe base e convertê-la explicitamente:

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
fonte