Ich habe eine Wrapper-Klassenvorlage und möchte implizit in den Wrapped-Typ konvertiert werden, um vorhandene Bibliotheksfunktionen zu verwenden:
%Vor% f(std::complex<T>)
wird nicht für f(ca)
verwendet, da die implizite Konvertierung während der Argumentableitung nicht berücksichtigt wird (siehe generierte Fehler-Meldung. hier ).
Im realen Code wird f(...)
durch Bibliotheksfunktionen ersetzt, z. aus dem Header <complex>
, so dass es nicht geändert werden kann.
Wenn ich A
von T
vererbe (wie von der Fehlermeldung vorgeschlagen), kompiliert f(ca)
. Aber dann ist A
nicht für eingebaute Typen definiert (Sie können nicht von ihnen erben). Das würde auch die gesamte Funktionalität von complex<double>
bis A<complex<double>>
ergeben, die ich vermeiden möchte.
Gibt es einen Workaround dafür?
Um das Problem "funktioniert nicht für integrierte Typen" zu lösen, können Sie eine Template-Spezialisierung verwenden. Die std::complex<>
version verwendet Vererbung.
Wenn Vererbung nicht akzeptabel ist, ist der einzige Ansatz, den ich kenne, Funktionen zu definieren, die A<>
als Argument verwenden. Sie können die Aufgabe jedoch vereinfachen, indem Sie die Funktionen in A<>
selbst definieren und so eine vereinfachte Syntax für das Template-Argument und eine argumentabhängige Suche für den Funktionsaufruf verwenden.
Tags und Links c++ type-conversion templates