具有多态性和通用向量的泛型编程

时间:2015-08-26 03:28:44

标签: c++ templates vector polymorphism generic-programming

我有这段代码:

struct All { public: All() {} ~All() {} };

template <typename T>
struct any : public All
{
    public:
        any() : All() {}
        ~any() {} 
        T value;
};

int main()
{
    any<int>* a = new any<int>;
    a->value = 55;

    any<string>* b = new any<string>;
    b->value = "Hello World !";

    vector<All*> vec;
    vec.push_back(a);
    vec.push_back(b);

    for (int i = 0; i < (int)vec.size(); i++) {
        All* tmp = vec[i];
        cout << tmp->value << endl; // Error appears here
    }

    return 0;
}

以下错误:

  

struct'All'没有名为'value'的成员

我不知道如何避免这个错误。似乎在for循环中tmp是一个All对象,而All对象没有名为value的成员。 他们没有办法从All对象any访问子结构(tmp)成员变量以避免这个问题,并且有一个完全功能的通用向量?

1 个答案:

答案 0 :(得分:0)

由于基类/派生类不是多态的-> value,因此无法使用基指针类型进行访问。

您可以添加虚拟功能来打印该值。

#include <string>
#include <iostream>
#include <vector>
using namespace std;

struct All
{
public: All() {} ~All() {}
        virtual void print() = 0;
};

template <typename T>
struct any : public All
{
public:
    any() : All() {}
    ~any() {}
    T value;

    virtual void print() override
    {
        cout << value << endl;
    }
};

int main()
{
        auto a = std::make_shared<any<int>>();
a->value = 55;

auto b = std::make_shared<any<string>>();
b->value = "Hello World !";

vector<std::shared_ptr<All>> vec;
vec.push_back(a);
vec.push_back(b);

for (auto const& elem : vec)
{
    elem->print();
}
    return 0;
}