C++;通用向量 是否可以在C++中创建多种类型的向量?我希望能够构建并迭代包含许多不同类型的向量。例如: vector<generic> myVec; myVec.push_back(myInt); myVec.push_back(myString); etc... 向量myVec; myVec.push_back(myInt); myVec.push_back(myString); 等

C++;通用向量 是否可以在C++中创建多种类型的向量?我希望能够构建并迭代包含许多不同类型的向量。例如: vector<generic> myVec; myVec.push_back(myInt); myVec.push_back(myString); etc... 向量myVec; myVec.push_back(myInt); myVec.push_back(myString); 等,c++,generics,vector,C++,Generics,Vector,向量需要能够容纳不同的数据类型。是否有另一个向量,像I类应该在C++库中使用? 任何方向都行。您可以使用。例如: #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;

向量需要能够容纳不同的数据类型。是否有另一个向量,像I类应该在C++库中使用?

任何方向都行。

您可以使用。例如:

#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
还支持访问。您可以定义一个可以处理变量中所有可能类型的访问者:

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;
    }
};
struct my\u visitor:boost::static\u visitor
{
void操作符()(inti)
{

std::cout可能是
boost::variant
的向量。另一种选择是
boost::any
不是
std::vector
,而是
std::tuple
(在C++11中).std::vector是一个统一类型的容器。@AdityaKumar:但这会固定每个元素的大小和类型,这比多态对象的向量更具限制性。在使用
boost::any
之前,我会仔细查看您的代码,看看是否有其他更好的方法。因为有。@ChristopherBales:很高兴我能提供帮助:)不幸的是,对于
boost::any
来说,似乎没有一个好的方法来获取值,除非您对其进行任何强制转换。对于(vector::iterator it=test.begin();it!=test.end();it++){if(strcmp(it->type(){cout@ChristopherBales:除了
any#u cast
之外,您可能会对未知类型的对象做什么?对于此注释中的代码,正确的做法是使用
boost::variant
并应用此答案中所述的访问者模式。@MooingDuck我习惯于使用C#,在这里您可以制作一个IEnumerable外接程序Tiges(对象),字符串,任何你想要的对象。然后你可以用绝对的方便迭代迭代集合。这显然是C++中一个更复杂的问题因为铸造问题。
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);
    }
}