Ist es möglich, in einer using-Deklaration auf eine benutzerdefinierte Konvertierungsvorlage zu verweisen?


8

In einer Klasse, Bdie von einer Klasse erbt A, ist es möglich, eine usingDeklaration zu verwenden, um Mitglieder Ain Bsogar Vorlagen wie diese zu bringen:

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

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

Aber kann es für Konvertierungsvorlagen gemacht werden?

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

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

Es scheint keine Möglichkeit zu geben, namentlich auf die Vorlage zu verweisen, aber ich würde mich gerne als falsch erweisen oder eine Klarstellung erhalten.


1
Was ist der Anwendungsfall?
R Sahu

@RSahu Vermutlich, um einen konvertierenden Konstruktor zu erben, ohne dass eine öffentliche Vererbung erforderlich ist.
Ayjay

@ Ayjay, wenn das der Fall ist, dann ist die Verwendung von privateVererbung schlecht durchdacht, IMO.
R Sahu

@ RSahu Ayjay ist richtig. Um genauer zu sein, möchte ich zulassen, dass eine Klasse Cvon ihnen erbt B, Csollte aber keinen Zugriff auf Adie geschützten Methoden haben. Ich möchte jedoch, dass Adie öffentlichen Methoden öffentlich bleiben, einschließlich dieses Konvertierungsoperators. Ich weiß, dass ich dies auf einige Arten umgehen könnte, aber ich würde es lieber vermeiden, zusätzlichen Code zu schreiben, um so wenig Nutzen zu erzielen.
Äpfel

@Apples, das scheint ein Designfehler zu sein. Ich weiß nicht, wie viel Kontrolle Sie über diese Klassen haben. Wenn Sie die Kontrolle darüber haben, was hineingeht A, können Sie sich Ain zwei Klassen aufteilen - eine, Bdie erben kann, publicund die andere private.
R Sahu

Antworten:


3

Um dieses Problem zu umgehen, können Sie es in die Basisklasse umwandeln und explizit konvertieren:

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;
}
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.