如何获取任何类型的默认值

新手上路,请多包涵

在 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 许可协议

阅读 629
1 个回答

在 C++ 中,C# 中没有 default 关键字。由于类类型值的默认构造函数初始化会失败,如果默认构造函数是 private 。在 C# 中,如果默认构造函数是私有的,则 class-type 的值将初始化为 null ,因为 class-type 是 reference-type

{} 初始化由语言规范定义。它是 C++11。在 C++03 中你应该使用

T obj = T();

正如 bames53 在评论中指出的那样,当你想初始化 T* 你应该使用

在 C++11 之前。

 T* obj = 0;

或者

T* obj = NULL;

在 C++11 中。

 T* obj = {};

或者

T* obj = nullptr;

原文由 ForEveR 发布,翻译遵循 CC BY-SA 3.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题