C++0x hat explizite Konvertierungsoperatoren hinzugefügt, aber sie müssen immer als Mitglieder der Klasse Source definiert werden. Dasselbe gilt für den Zuweisungsoperator, er muss in der Zielklasse definiert werden.
Wenn die Quell- und Zielklassen der benötigten Konvertierung unabhängig voneinander sind, kann weder die Quelle einen Konvertierungsoperator definieren, noch kann das Ziel einen Konstruktor aus einer Quelle definieren.
Normalerweise erhalten wir sie durch die Definition einer bestimmten Funktion wie
Target ConvertToTarget(Source& v);
Wenn C++0x die Überladung des Konvertierungsoperators durch Nicht-Member-Funktionen erlauben würde, könnten wir zum Beispiel die Konvertierung implizit oder explizit zwischen nicht verwandten Typen definieren.
template < typename To, typename From >
operator To(const From& val);
Wir könnten zum Beispiel die Umwandlung von chrono::time_point in posix_time::ptime wie folgt spezialisieren
template < class Clock, class Duration>
operator boost::posix_time::ptime(
const boost::chrono::time_point<Clock, Duration>& from)
{
using namespace boost;
typedef chrono::time_point<Clock, Duration> time_point_t;
typedef chrono::nanoseconds duration_t;
typedef duration_t::rep rep_t;
rep_t d = chrono::duration_cast<duration_t>(
from.time_since_epoch()).count();
rep_t sec = d/1000000000;
rep_t nsec = d%1000000000;
return posix_time::from_time_t(0)+
posix_time::seconds(static_cast<long>(sec))+
posix_time::nanoseconds(nsec);
}
Und verwenden Sie die Konvertierung wie jede andere Konvertierung.
Eine ausführlichere Beschreibung des Problems finden Sie unter ici oder auf meinem Boost.Conversion Bibliothek.
Die Frage ist also: Was ist der Grund dafür, das Überladen des C++-Umwandlungsoperators mit Nicht-Mitgliederfunktionen nicht zuzulassen?