unionメンバーは、デストラクタまたはコンストラクタを持つことはできません。したがって、コンストラクターがある場合、次のクラスFooを自分でテンプレート化することはできません。MyClassMyClass
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::ペア
で使用できることにも少し驚いています:std::pairunion
Foo<std::pair<bool, double> > f2(std::make_pair(true, 3.12));
私の知る限り、std::pair(コードを参照)コンストラクターはありますか?