c++泛型向量

C++ Generic Vector

本文关键字:向量 泛型 c++      更新时间:2023-10-16

是否可以在c++中创建多种类型的矢量?我希望能够构建和迭代一个包含许多不同类型的向量。例如:

vector<generic> myVec;
myVec.push_back(myInt);
myVec.push_back(myString);
etc...

vector需要能够保存不同的数据类型。是否有另一种类似向量的类型我应该在c++库中使用?

您可以使用boost::any。例如:

#include <vector>
#include <boost/any.hpp>
#include <iostream>
struct my_class { my_class(int i) : x{i} { } int x; };
int main()
{
    std::vector<boost::any> v;
    v.push_back(42);
    v.push_back(std::string{"Hello!"});
    v.push_back(my_class{1729});
    my_class obj = boost::any_cast<my_class>(v[2]);
    std::cout << obj.x;
}

如果您想将允许的类型集限制在某个定义的范围内,您可以使用boost::variant来代替:

#include <vector>
#include <boost/variant.hpp>
#include <iostream>
struct my_class { my_class(int i) : x{i} { } int x; };
int main()
{
    typedef boost::variant<int, std::string, my_class> my_variant;
    std::vector<my_variant> v;
    v.push_back(42);
    v.push_back("Hello!");
    v.push_back(my_class{1729});
    my_class obj = boost::get<my_class>(v[2]);
    std::cout << obj.x;
}

boost::variant也支持访问。您可以定义一个访问者,它可以处理变量

中的所有可能的类型:
struct my_visitor : boost::static_visitor<void>
{
    void operator () (int i)
    {
        std::cout << "Look, I got an int! " << i << std::endl;
    }
    void operator () (std::string const& s)
    {
        std::cout << "Look, I got an string! " << s << std::endl;
    }
    void operator () (my_class const& obj)
    {
        std::cout << "Look, I got a UDT! And inside it a " << obj.x << std::endl;
    }
};

然后调用,如下所示:

int main()
{
    typedef boost::variant<int, std::string, my_class> my_variant;
    std::vector<my_variant> v;
    v.push_back(42);
    v.push_back("Hello!");
    v.push_back(my_class{1729});
    my_visitor mv;
    for (auto const& e : v)
    {
        e.apply_visitor(mv);
    }
}

下面是一个的实例。关于boost::variant的好处是,它将执行编译时检查,以确保您的访问者可以处理该变体可以容纳的所有类型。