如何在模板化类中获取struct以获取任何类型的模板参数?

时间:2016-06-20 14:53:08

标签: c++ templates

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

2 个答案:

答案 0 :(得分:1)

您可以使用联合:

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

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

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

答案 1 :(得分:0)

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

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的请求。