代码之家  ›  专栏  ›  技术社区  ›  DaClown

如何将不同的模板类型放入一个向量中

  •  8
  • DaClown  · 技术社区  · 17 年前

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

    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;
    

    3 回复  |  直到 17 年前
        1
  •  14
  •   Benoît photo_tom    17 年前

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

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

    typedef boost::variant<ArgumentType1, ArgumentType2, ArgumentType3> ArgumentType;
    std::vector<ArgumentType> vec;
    
        2
  •  6
  •   Dominik Grabiec    17 年前

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