难以创建可以容纳任何数据类型的模板通用向量

Having difficulty in creating a templatized generic vector which can hold any datatype

本文关键字:向量 任何 创建 数据类型      更新时间:2023-10-16

正如主题所建议的那样,我正在尝试创建一个可以容纳任何数据类型的向量。我正在尝试使用模板,以便代码可以在将来更加可维护。

#include<iostream>
#include<memory>
#include<vector>
struct prime{
    public:
        template<typename T>
        T  get();
};
template<typename T>
struct foo: prime{
    public:
        T i;
        foo(T k):i(k){
        }
        template<typename T1>
        T1 get(){
            return i;
        }
};
/*
struct fooString :prime{
    public:
        std::string i;
        fooString(std::string k):i(k){
        }
};
*/
int main(){
    std::vector<std::shared_ptr<prime>> v;
    std::shared_ptr<foo<int>> p1 = std::make_shared<foo<int>>(0);
    std::shared_ptr<foo<char>> p3 = std::make_shared<foo<char>>('H'); 
    //std::shared_ptr<fooString> p2 = std::make_shared<fooString>("HK");
    v.push_back(p1);
    v.push_back(p3);
    //v.push_back(p2);
    //std::cout<<v[0]->i<<" "<<v[1]->i<<std::endl;
    //std::cout<<static_cast<foo<int>>(*v[0]).get();
    std::cout<<v[0]->get<int>();
}

评论的代码是我试图解决此问题的不同方法。但是我无法破解这一点。任何建议都会对我有很大帮助。我尝试遵循此操作,但是正如我所说,建立不同数据类型的结合很难维护。而且boost::variant也无济于事,因为我必须在手动之前提供其需要保留的所有类型。我不想那个限制。谁能暗示我是否有可能,还是我只是想实现不可能的事情?我的脑海中还有另一种算法,就像铸造所有内容并存储它一样。但是这种方法看起来不合适。

谢谢:)

如果您想要的是一个可以存储任何类型的容器,但实际上不会给您任何有关它的信息 - 这取决于您只能知道哪个类型的每个元素实际上存储了,那么这正是std::any(基于boost.any)的目的。

您的情况是:

int main(){
    std::vector<std::any> v;
    v.push_back(0);                  // an int
    v.push_back('H');                // a char
    v.push_back(std::string{"HK"});  // a string
    std::cout << std::any_cast<int>(v[0]); // this will throw if v[0] is not an int
    std::string* p = std::any_cast<std::string>(&v[1]); // this will return nullptr
                                                        // if v[1] is not a string, which
                                                        // it is not
}