Ich habe eine Menge von Funktionen mit solchen Unterschriften:Implizite Zeiger Conversions POD Zeiger
//libraries I can't change
void f1(double *x);
void f2(double *x1, double *x2);
...
Und eine Menge Code, die sie verwendet:
//my code
double x; ... f1(&x);
double x1[] = ...; double x2 = ...; f2(x1, &x2);
...
Aus irgendwelchen Gründen habe ich beschlossen, in verwenden Mein Code spezielle Klasse anstelle von gewöhnlichen verdoppelt:
Diese DoubleClass verhält sich wie doppelt mit einigen zusätzlichen Funktionalität, die ich will. Im Speicher ist DoubleClass das Gleiche wie Double. Es hat nur 1 Mitglied und Größe von (DoubleClass) == sizeof (double). Und so möchte ich mit so etwas wie
#define double DoubleClass
alle Doppel in meinem Code neu deklarieren Aber ich Code nicht kompilieren kann, weil es keine Konvertierung von DoubleClass * ist * zu verdoppeln. Ich kann die Funktionen f1, f2 nicht ändern. Also wollte ich fragen, ob ich irgendwie eine implizite Umwandlung von DoubleClass * zu Double * definieren kann oder vielleicht gibt es ein paar Tricks, die das erlauben.
Das ist wahrscheinlich eine sehr schlechte Idee, könnte Sie ein Backup mit etwas Überlegung, warum Sie eigentlich wollen, dies zu tun? –
'# define' eines beliebigen Sprachen-Schlüsselwortes, einschließlich' double' ergibt ein undefiniertes Verhalten. Es gibt auch keine Möglichkeit, neue implizite Umwandlungen zwischen zwei unterschiedlichen Zeigertypen zu definieren (z. B. von "DoubleClass *" zu "double *"). Sie wären besser dran, wenn Sie mit Ihrem Editor eine globale Ersetzung von 'double' mit' DoubleClass' durchführen würden (außer natürlich in der Klasse 'DoubleClass'). Wenn Sie später entscheiden, Ihre 'struct DoubleClass' in' double' umzuwandeln, müssen Sie lediglich die Strukturdeklaration und '#define DoubleClass double' entfernen. – Peter
Ich möchte dies tun, weil ich Vergleichsoperatoren etwas Funktionalität hinzufügen muss (ich möchte wissen, ob es Fälle gibt, in denen 2 sehr geschlossene Doppelgänger verglichen und als nicht gleich bestimmt werden, weil sie sich ein wenig unterscheiden). Vielleicht hat Peter Recht und Global Replacement mit Editor ist die beste Wahl. –