在 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 = {}
,效果很好。我只是不太确定它是否是语言规范定义的语法,这种代码是否是可移植的交叉编译器和平台。请帮我解决我的疑问!提前致谢!
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
}
它看起来很难看,但应该不会造成任何麻烦,毕竟归零的对象只是一块空白内存。我错了吗?
原文由 Need4Steed 发布,翻译遵循 CC BY-SA 4.0 许可协议
在 C++ 中,C# 中没有
default
关键字。由于类类型值的默认构造函数初始化会失败,如果默认构造函数是private
。在 C# 中,如果默认构造函数是私有的,则 class-type 的值将初始化为null
,因为 class-type 是reference-type
。由
{}
初始化由语言规范定义。它是 C++11。在 C++03 中你应该使用正如 bames53 在评论中指出的那样,当你想初始化
T*
你应该使用在 C++11 之前。
或者
在 C++11 中。
或者