给出了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
得到0
,float
获得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类型变量的效果呢?
答案 0 :(得分:1)
您可以使用const T& data = T();
。这可以保证避免副本等,T
将被初始化,这是需要它的类型的默认构造,或者是所有其他类型的默认构造。
答案 1 :(得分:0)
template <typename data>
void example(data arg)
{
arg = 0;
}
对于非POD-s
答案 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。