Jak uzyskać domyślną wartość dowolnego typu
W C # mogę napisać coś takiego:
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);
}
Zamierzam napisać słownik w klasie C ++ w języku C ++, chciałbym, aby dyktator zwrócił wartość domyślną (zero) ogólnego typu TVal, jeśli dany klucz nie zostanie znaleziony. W C # ratuje się domyślna konstrukcja (T), podczas gdy w C ++ nie jestem pewien, jaki jest odpowiedni sposób na zrobienie tego samego.
próbowałemT obj = {}
iT* obj = {}
z gcc4.7 działa dobrze. Po prostu nie jestem pewien, czy jest to składnia zdefiniowana przez specyfikację języka, jeśli ten kod będzie przenośnym kompilatorem i platformą. Pomóż mi z moim głośnikiem! Z góry dziękuję!
PS:
~~~~~~~~~~
Aby upewnić się, że szablon uzyska domyślną wartość (zerową) DOWOLNEGO typu, nawet tych, które nie mają domyślnego ctorla, zastosowałem następujący mechanizm (zainspirowany odpowiedzią avakara):
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
}
Wygląda brzydko, ale nie powinien sprawiać kłopotów, przecież wyzerowany obiekt to tylko kawałek pustej pamięci. Czy się mylę?