Como obter o valor padrão de qualquer tipo
Em c # eu posso escrever algo assim:
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);
}
Eu pretendo escrever um dicionário como classe de modelo em C ++, eu gostaria que o dict retornasse o valor padrão (zero out) do tipo TVal genérico se a chave dada não fosse encontrada. Em C # a construção padrão (T) vem para resgatar, enquanto em C ++ não tenho certeza qual é a maneira apropriada de fazer a mesma coisa.
eu tenteiT obj = {}
eT* obj = {}
com gcc4.7, funciona bem. Eu não estou tão certo se é a sintaxe definida pela especificação da linguagem, se esse tipo de código for compiladores e plataformas cruzadas portáveis. Por favor me ajude com meu doudt! Desde já, obrigado!
PS:
~~~~~~~~~~
Para garantir que o template obtenha o valor padrão (zero out) de QUALQUER tipo, mesmo daqueles que não possuem o padrão de callable, usei o seguinte mecanismo (inspirado na resposta do 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
}
Parece feio, mas não deve causar nenhum problema, afinal um objeto zerado é apenas um pedaço de memória em branco. Estou errado?