【问题标题】:How to put different template types into one vector如何将不同的模板类型放入一个向量中
【发布时间】:2009-03-30 08:26:27
【问题描述】:

我想构造一条长度或参数数量未知的消息。我拿了一个简单的模板,比如

template <typename T> class Argument {
public:
    int size;
    int type;
    T data;
};

还有一些重载

addMessage (int value) {
    Argument<int> *a = new Argument<int>;
    vec.push_back(a);
}

(字符串等相同)我尝试将其全部推入一个向量。我试过了

std::vector<Argument* > vec;
std::vector<Argument<typename T>* > vec;
std::vector<Argument<>* > vec;

但这似乎没有任何作用。有没有办法做到这一点?提前致谢。

【问题讨论】:

    标签: c++ templates polymorphism


    【解决方案1】:

    选项 1:确保所有不同类型的参数都派生自基类并使用指向该类的指针。请注意,此选项在内存管理方面存在风险。您可能希望通过使用 boost::shared_ptr 而不是指针来使其更安全。否则,当从向量中删除项目时,您必须手动清理。

    选项 2(我个人最喜欢的):使用 Boost.Variant 生成所有可能参数类型的 typedef,并将该 typedef 用作 std::vector 中的参数类型

    typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
    std::vector<ArgumentType> vec;
    

    【讨论】:

    • 当我认为模板被制作成手头有“所有类型”时,我好像错了。由于这个项目中没有使用 Boost,但我会坚持继承。谢谢
    • std::variant 自 C++17 起可用。 en.cppreference.com/w/cpp/utility/variant
    【解决方案2】:

    最简单的方法是创建一个未模板化的基本 Argument 类,然后从它派生特定的数据类型。 (您甚至可以让模板化版本直接从基类派生,只使用这两个类。)然后将它们作为指针存储在向量中。

    这确实需要某种函数来访问参数值并根据需要执行任何转换。

    【讨论】:

      【解决方案3】:

      你可以使用 boost::variant (http://www.boost.org/doc/libs/1_38_0/doc/html/variant.html)
      或 boost::any (http://www.boost.org/doc/libs/1_38_0/doc/html/any.html) 类型

      或 void* - 丑陋且不安全
      或实现自己的泛型类型,该泛型类型将具有一个接口和不同的模板化实现,并将指针存储在该接口上。

      但我不确定使用相似类型是否是好的设计。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-07-08
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多