//Yes derive Column from an abstract base class, say ColumnItf and then make a vector of unique pointers to that.Don't use raw pointers and new/delete that will lead to memory leaks.
#include <iostream>
#include <string>
#include <vector>
#include <memory>
struct ColumnItf
{
virtual void visit() const = 0;
};
template<typename type_t>
class Column :
public ColumnItf
{
public:
explicit Column(const type_t& data) :
m_data{ data }
{
}
void visit() const override
{
std::cout << m_data << "\n";
}
private:
type_t m_data;
};
int main()
{
std::vector<std::unique_ptr<ColumnItf>> columns;
columns.emplace_back(std::make_unique<Column<int>>(1));
columns.emplace_back(std::make_unique<Column<std::string>>("Hello"));
for (const auto& itf : columns)
{
itf->visit();
}
return 0;
}