J
boost hat auch kein force_cast, sondern nur ein remove_const und sowas.
Das ist kein Compiler-Fehler. Steht doch klar da was los ist. Nimm Dir die Funktion, schreib das rein was der Compiler dort einsetzt und Du wirst sehen, die Signatur stimmt bis auf den Rückgabetyp überein. Der Compiler hat recht, der Aufruf ist mehrdeutig.
Ein Problem ist, daß bei der ersten Lösung, die ich angegeben habe, vermutlich template-argument-deduction schief geht.
Was man machen könnte wäre sowas:
template<typename T>
class is_const
{
enum { value = false };
};
template<typename T>
class is_const<const T>
{
enum { value = true };
};
template <typename T, bool addConst>
class add_const
{
typedef T value;
};
template <typename T, bool addConst>
class add_const<T, true>
{
typedef const T value;
};
template <typename DestinationType, typename SourceType>
inline add_const_if<DestinationType, is_const<SourceType>::value >::value & force_cast(SourceType& source)
{
typedef add_const_if<DestinationType, is_const<SourceType>::value DestType;
return *reinterpret_cast<DestType*>(&source);
}
Wenn also der Source-Type ein const mit sich bringt, dann hängen wir auch an den DestinationType eins dran.
Damit sollte template-Argument-Deduction funktionieren, außerdem isses nur noch eine Funktion statt zweien.
MfG Jester
P.S.: nicht getestet