Как получить значение по умолчанию любого типа
В C # я могу написать что-то вроде этого:
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);
}
Я намереваюсь написать словарь, подобный шаблонному классу, в C ++, мне бы хотелось, чтобы dict возвращал значение по умолчанию (обнуление) общего типа TVal, если данный ключ не найден. В C # спасает конструкция по умолчанию (T), в то время как в C ++ я не уверен, что является подходящим способом сделать то же самое.
Я пыталсяT obj = {}
а такжеT* obj = {}
с gcc4.7 работает хорошо. Я просто не уверен, что это синтаксис, определенный в спецификации языка, если этот код будет переносимым кросс-компилятором и платформой. Пожалуйста, помогите мне с моим doudt! Заранее спасибо!
PS:
~~~~~~~~~~
Чтобы убедиться, что шаблон получает значение по умолчанию (обнуление) ЛЮБОГО типа, даже из тех, у которых нет вызываемого по умолчанию ctor, я использовал следующий механизм (вдохновленный ответом avakar):
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
}
Это выглядит некрасиво, но не должно вызывать каких-либо проблем, ведь обнуляемый объект - это просто кусок пустой памяти. Я ошибся?