【问题标题】:How to correctly initialize member variable of template type?如何正确初始化模板类型的成员变量?
【发布时间】:2019-10-14 09:19:32
【问题描述】:

建议我有如下模板函数:

template<class T>
void doSomething()
{
    T a; // a is correctly initialized if T is a class with a default constructor
    ...
};

但变量 a 未初始化,如果 T 是原始类型。我可以写 T a(0),但如果 T 是一个类,这不起作用。有没有办法在这两种情况下初始化变量(T == class,T == int,char,bool,...)?

【问题讨论】:

  • 已编辑问题标题以避免在指代模板变量或模板成员时出现歧义。有一些与前者相关的模板魔法。

标签: c++ templates


【解决方案1】:

像这样:

T a{};

C++11 之前,这是最简单的近似:

T a = T();

但它要求T 是可复制的(尽管副本肯定会被省略)。

【讨论】:

  • 刚刚注意到,像int i = bool() 这样的东西也可以工作......为什么这是合法的?!......在这种情况下bool() 是某种功能吗?
  • 顺便说一句,unsigned int i = unsigned int(); 不能用 GCC 编译,但它合法吗?
  • @smerlin:我已经回答了你的第一个问题,正式问你的第二个问题:stackoverflow.com/questions/2144012/…;我相信答案是这对于由简单类型说明符组合指定的类型无效,例如unsigned int.
  • identity&lt;unsigned int&gt;::type()。元括号 xD
  • @Johannes Schaub 为什么不unsigned i = unsigned();int 在这种情况下是隐含的。
【解决方案2】:

C++11 中的类模板字段语法相同:

template <class T>
class A {
  public:
    A() {}
    A(T v) : val(v) {}
  private:
    T val{};
};

【讨论】:

    猜你喜欢
    • 2021-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多