So erhalten Sie den Standardwert eines beliebigen Typs
In C # kann ich so etwas schreiben:
class AnyThing<T>
{
static public T Default = default(T);
}
static void Main ()
{
int i = AnyThing<int>.Default;
Console.WriteLine (i==0);
string s = AnyThing<string>.Default;
Console.WriteLine (s == null);
}
Ich beabsichtige, ein Wörterbuch wie eine Template-Klasse in C ++ zu schreiben. Ich möchte, dass das Diktat den Standardwert (Null aus) des generischen TVal-Typs zurückgibt, wenn der angegebene Schlüssel nicht gefunden wird. In C # kommt das Standard (T) -Konstrukt zur Rettung, während ich in C ++ nicht sicher bin, wie ich dasselbe tun soll.
ich habe es versuchtT obj = {}
undT* obj = {}
mit gcc4.7 funktioniert es gut. Ich bin mir nur nicht so sicher, ob es sich um die in der Sprachspezifikation festgelegte Syntax handelt, ob dieser Code portabel für Cross-Compiler und Plattformen sein wird. Bitte hilf mir mit meinem doudt! Danke im Voraus!
PS:
~~~~~~~~~~
Um sicherzustellen, dass die Vorlage den Standardwert (Null) von JEDEM Typ erhält, auch von jenen, die keinen aufrufbaren Standard-ctor haben, habe ich folgenden Mechanismus angewendet (inspiriert von Avakars Antwort):
template<class T>
struct AnyThing
{
static const T& Default ;
private:
static const char temp[sizeof(T)];
};
template<class T> const char AnyThing<T>::temp[] = {};
template<class T> const T& AnyThing<T>::Default = *(T*)temp;
struct st
{
double data;
st()=delete;
};
int main()
{
cout << (int)AnyThing<char*>::Default<<endl; //0
cout << AnyThing<int>::Default<<endl; //0
cout <<AnyThing<st>::Default.data<<endl; //0
}
Es sieht hässlich aus, sollte aber keine Probleme verursachen, schließlich ist ein auf Null gesetztes Objekt nur ein Stück leeren Speichers. Liege ich falsch?