L
Dravere schrieb:
Wieso hälst du eigentlich eine Referenz auf einen Zeiger im ArrayWrapper ? Ist nicht so günstig um einen operator = vom Kompiler generieren zu lassen
Das ist im Zuge der Verkürzung reingekommen - im Real World Code ist es ein Doppelzeiger
Die Idee mit dem Memberzeiger hatte ich auch schon, da bräuchte man sogar kein Helfertemplate mehr - inkl. dem Versuch, &T::array als Defaultparameter übergeben zu lassen, was der Compiler aber nicht wirklich mochte. Ist aber auch irgendwie klar, wie soll der Compiler auch den zweiten Templateparameter herleiten, bevor das dazugehörige Argument bekannt ist.
/* Verkürzte Version ohne Helper */
struct X
{
int wert;
};
struct ArrayOfX
{
size_t size;
X* array;
};
template< typename Struct, typename Type >
struct ArrayWrapper
{
};
template< typename Struct, typename Type >
ArrayWrapper< Struct, Type > ArrayOf( Struct*& capsule, Type* ( Struct::*array ) /* = &Struct::array */ )
// das Default-Argument wird, wenn vorhanden, nichtmals angemeckert. Nur ist es kein wirklicher Default, weil der Aufruf mit einem Parameter nicht funktioniert.
{
return ArrayWrapper< Struct, Type >();
}
int main()
{
ArrayOfX* capsule = 0;
ArrayOf( capsule, &ArrayOfX::array );
}
Da wäre mir dann aber die Syntax ArrayOf< X >( capsule ); für den Standardfall und ArrayOf( capsule, &ArrayOfX::abweichenderName ); für den Fall abweichender Namen lieber:
// Parameter vertauscht, wegen ArrayOf< Type >
template< typename Type, typename Struct >
ArrayWrapper< Struct, Type > ArrayOf( Struct*& capsule, Type* ( Struct::*array ) = &Struct::array )
{
return ArrayWrapper< Struct, Type >();
}
Ich lasse mir aber tatsächlich auch nochmal die Möglichkeit eines Generators für eine automatische Traits-Erstellung durch den Kopf gehen.