如何初始化模板化类型以将POD数据清零或默认构造非POD数据?

时间:2015-07-11 19:24:23

标签: c++ templates c++03

给出了C ++中模板化的C ++函数 - 03:

template <typename data>
void example(data arg) {
  // How to get POD zero initialized and non-POD, default constructor?
  data x();
  ...
}

如果它是POD,我怎么能将模板化参数归零(例如int得到0float获得0.0等等,或者对于非-POD,使用其默认构造函数?

我看到班级成员,这个问题被处理为explained here,其中包含:

struct X
{
   int x;
};

X x;        //x.x is not initialized
X y = X();  //y.x is 0

但是在这种情况下,变量不是类的成员,那么如何相应地获得初始化POD类型变量和默认构造非POD类型变量的效果呢?

3 个答案:

答案 0 :(得分:1)

您可以使用const T& data = T();。这可以保证避免副本等,T将被初始化,这是需要它的类型的默认构造,或者是所有其他类型的默认构造。

答案 1 :(得分:0)

template <typename data>
void example(data arg) 
{
     arg  = 0;
}

对于非POD-s

  1. 定义适当的复制构造函数,将此对象设置为零
  2. overload“=”operator

答案 2 :(得分:0)

我很抱歉甚至写这个解决方案,但你可以使用boost和type traits来实现每个字面上不同的代码路径:

template <class T>
void f(typename boost::enable_if<boost::is_pod<T>, int>::type = 0) {
  T t = T();
  g(t);
}

template <class T>
void f(typename boost::disable_if<boost::is_pod<T>, int>::type = 0) {
  T t;
  g(t);
}

template <class T>
void g(const T & t) {
  std::cerr << t.x << std::endl;
}

也许您应该使用is_trivially_constructible特征而不是is_pod。我知道这不是很漂亮,但它应该有效,并且可以很好地扩展。我假设编译器会对性能做一些聪明的事情,但如果你真的担心你可以强制g(这是你的函数的其余部分将被实现的地方)总是内联到f。