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ę?

questionAnswers(4)

yourAnswerToTheQuestion