在 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# 中,default(T) 构造来拯救,而在 C++ 中,我不确定做同样事情的合适方法是什么。
我已经尝试过T obj = {}
使用T* obj = {}
gcc4.7,它运行良好。我只是不太确定它是否是语言规范定义的语法,这种代码是否是可移植的交叉编译器和平台。请帮我解决我的疑问!提前致谢!
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
}
它看起来很难看,但应该不会造成任何麻烦,毕竟归零的对象只是一块空白内存。我错了吗?