如何让模板化类中的结构采用任何类型的模板参数?

How to get struct in templated class to take any type of template parameters?

本文关键字:任何 类型 参数 结构      更新时间:2023-10-16

>我得到了一个A类template<typename T1, typename T2> class A{...};在这个班级中,我想有一个struct B { (type of any of the parameters of A) m_type; }.这样我就可以有一个 B 与 m_tpye 的 T1 和一个 B 与 m_type 的 T2。这可能吗?

您可以使用联合:

template<typename T1, typename T2> class A {
struct B {
union {
T1 t1;
T2 t2;
} m_type;
};
};

但是,工会有严格的限制,在您的情况下可能不被接受,而且很容易被滥用。我建议改用类型安全的variant类型。不幸的是,标准库中还没有这样的类型,因此您需要使用第三方实现,或者自己实现,或者尝试将提案N4542放入标准中。

我还建议您考虑是否真的需要具有具有不同类型的成员的B类型的对象。

也许像下面的例子可以完成这项工作:

template<typename... T>
struct B: T... { };
template<typename T1, typename T2>
struct A{
B<T1,T2> b;
};
struct S1 { };
struct S2 { };
void f1(const S1&) { }
void f2(const S2&) { }
int main() {
A<S1, S2> a;
f1(a.b);
f2(a.b);
}

这里B继承自S1S2,所以实际上它是它们两个,正如OP所要求的那样。