W języku C# można napisać coś takiego:Jak uzyskać wartość domyślną każdego rodzaju
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łownika jak klasy szablonu w C++, chciałbym dict aby przywrócić domyślne wartość (zero na wyjściu) ogólnego rodzaju TVal, jeśli dany klucz nie zostanie znaleziony. W C# domyślny (T) konstrukt przychodzi na ratunek, podczas gdy w C++ nie jestem pewien, jaki jest właściwy sposób robienia tego samego.
Próbowałem już T obj = {}
i T* obj = {}
z gcc4.7, to działa dobrze. Po prostu nie jestem pewien, czy jest to składnia zdefiniowana przez specyfikację języka, jeśli ten rodzaj kodu będzie przenośnym cross kompilatorem i platformą. Proszę, pomóż mi z moim doudtem! Z góry dziękuję!
PS:
~~~~~~~~~~
Aby upewnić się, że szablon dostać domyślne (zero out) wartość dowolnego typu, nawet tych, które nie posiadają wymagalne domyślny konstruktor, I zatrudniony następujące mechanizm (inspirowany odpowiedź avakar'S):
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
}
to wygląda brzydko, ale nie powinny powodować żadnych problemów, po wszystkim wyzerowany obiekt jest po prostu kawałek pustej pamięci. Czy się mylę?
http://stackoverflow.com/questions/1962600/co-jest-c-cli-odpowiednik-cs-defaultt – Khurshid
Nie jestem całkowicie pewien, czy to rozwiązuje twój problem, ale myślę, że [Boo st.Value Initialized] (http://www.boost.org/doc/libs/release/libs/utility/value_init.htm) próbuje rozwiązać ten problem. –