Frage

Ich bin das folgende Problem: Ich habe eine Klasse V (sagen einen Vektor), von dem ich zwei Klassen produzieren können: CI und ich (man denke an const_iterator und Iterator). Wenn ich ein const V haben, dann kann ich nur produzieren CI (wieder denken Iterator und const_iterator).

Im Grunde möchte ich subsitute (const V & v) wie mit (CI ci) und (V & V) mit (I i). Außerdem würde ich noch in der Lage sein mag, um eine V passieren obj direkt an Funktionen ein I oder einen CI damit die impliziten Konvertierungen von V und konst V CI erwartet und mir.

Das Problem, das ich bin vor ist, dass während ladenen Funktionen können unterscheiden zwischen (const V & v) und (V & V), können sie nicht "unterscheiden" zwischen (CI ci) und (I i), wenn ich einen V obj passieren.

Code:

struct V {};

struct I 
{
    I( V& v ){}
};

struct CI
{
    CI( const V& v ){} //I would like to say const only 
};

void fun( I i )
{
    double x = 1.0;
}
void fun( CI ci )
{
    double x = 2.0;
}

void fun2( V& v )
{
    double x = 1.0;
}
void fun2( const V& v )
{
    double x = 2.0;
}

Hinweis I definiert Conversions Operator in V haben könnte (es ist gleichwertig?) Anstelle die Konstrukteure in CI zu definieren und I. Jetzt:

V v;
const V cv;

fun2( v );
fun2( cv );

fun( v ); //AMBIGUOUS!
fun( cv );

Gibt es eine Möglichkeit, dieses Problem zu lösen, ohne irgendwelche zusätzlichen Indirektion Zugabe (das heißt, die Spaß Funktionen nicht geändert werden kann und v muss direkt an Spaß weitergegeben werden, aber Sie sind frei, alles andere zu verändern).

Vielen Dank im Voraus für jede Hilfe!

War es hilfreich?

Lösung

Was Sie brauchen, ist hier explizit Konstrukteuren:

struct I 
{
    explicit I( V& v ){}
};

struct CI
{
    explicit CI( const V& v ){} //I would like to say const only 
};

Zu vielen C ++ Programmierer mit Blick auf das explizite Schlüsselwort für Konstrukteure. All unär parametrisiert Konstrukteure sollte standardmäßig explizit sein. Implizite Konstrukteure laden Mehrdeutigkeit Probleme wie diese sowie die zu sehr doof, Kreisverkehr Umwandlungsprozesse, die leicht zu problematisch und sehr ineffizienten Code führen kann.

Jetzt sind Sie Satz, Mehrdeutigkeit Problem gelöst. Ohne explizite Konstruktoren können Sie diese Mehrdeutigkeit Problem nicht verhindern.

Für den Client-Code, tun Sie Notwendigkeit, es zu ändern, um ihre Umsätze zu sein expliziten:

V v;
const V cv;

fun2( I(v) );
fun2( CI(cv) );

fun( I(v) );
fun( CI(cv) );

Eine solche Syntax wird nun auf Konstrukt Objekte von I oder CI erforderlich sein, aber das ist eine gute Sache. Niemand versehentlich mehr Mehrdeutigkeit Probleme vorstellen kann

Andere Tipps

Was nur über typedefs mit?

typedef V& I;
typedef const V& CI;

Edit:

Nein. Siehe Anmerkungen:)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top