É 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.


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;
}
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.