【问题标题】:C++: Containers of Arbitrary Template TypeC++:任意模板类型的容器
【发布时间】:2014-05-22 16:37:15
【问题描述】:

在 C++ 中,假设我有一个模板化的类,比如

template <typename T>
class Foo
{
    ...
};

假设我有几种 Foo 对象,比如

Foo<int> intFoo = Foo<int>();
Foo<double> doubleFoo = Foo<double>();
...

等等。

实际上,情况比这更糟。例如,我真的想要一个继承自 Foo 的类的 intFoo 对象。

我想做这样的事情:

std::vector<Foo<?> > aVector;
aVector.push_back(intFoo);
aVector.push_back(doubleFoo);

请记住,我已经大大简化了我的设计案例,有没有一种简单的方法可以做到这一点?

【问题讨论】:

    标签: c++ templates inheritance containers


    【解决方案1】:

    一个解决方案是让你的 Foo 从一个空的基类继承

    struct CommonBase {};
    
    template<typename T>
    class Foo : public CommonBase
    { 
        // ... 
    };
    

    然后有一个指向公共基础的指针容器

    vector<CommonBase*> v;
    

    如果你想避免继承,你可以使用boost:any 在你的容器中存储任何类型。

    一个有趣的话题(如果你想手动实现这类事情)是类型擦除

    【讨论】:

      【解决方案2】:

      Foo&lt;int&gt;Foo&lt;double&gt; 是 2 个不同的类,尽管它们共享名称 Foo,因此您不能将它们原样放在 vector 中。但是您可以使用boost::variant 并存储一个变体向量。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-12-05
        • 1970-01-01
        • 2012-01-24
        • 2013-08-12
        • 2021-05-10
        • 1970-01-01
        相关资源
        最近更新 更多