union
成员可能没有析构函数或构造函数。因此,如果有构造函数Foo
,我不能自己模板化以下类:MyClass
MyClass
template<class T>
struct Foo {
T val;
Foo(T val_) : val(val_) {}
size_t hash() const {
union {T f; size_t s;} u = { val };
return u.s;
}
};
struct MyClass {
bool a;
double b;
MyClass(bool a_, double b_) : a(a_), b(b_) {}
};
如果我仍然这样做,我会收到此错误:
member 'MyClass Foo<T>::hash() const
[with T = MyClass]::<anonymous union>::f' with constructor
not allowed in union
为了解决这个问题,我创建MyClass
了一个笨拙的构造函数,它首先复制周围的东西:
struct MyClass {
bool a;
double b;
};
MyClass createMyClass(bool a, double b) {
MyClass m;
m.a = a;
m.b = b;
return m;
}
但我想知道是否有比使用此createMyClass
功能更好的方法。构造函数会更高效,并且作为关键组件MyClass
,Foo<MyClass>
在我的代码中被构造了数百万次。
标准::对
我也有点惊讶它可以用于std::pair
:union
Foo<std::pair<bool, double> > f2(std::make_pair(true, 3.12));
据我所知,std::pair
(见代码)有一个构造函数?