【问题标题】:c++ initialize vector with pointers to class templatec ++使用指向类模板的指针初始化向量
【发布时间】:2023-01-23 15:07:56
【问题描述】:

我尝试使用指向模板类的指针来初始化 std 向量
使用 c++11 和 g++
像这样,它失败了:

template <typename T>
struct Column  
{
    Column( T data)
    {             
        this->data = data;
    }

    T data;
    
}; 

int main(int argv,char** argc)
{
  std::vector<std::vector<Column*>> csv;
  
}

这我需要我可以像这样初始化不同类型的列:

 Column<std::string>* tmpString = new Column<std::string>(each);
 csv[0].push_back(tmpString);    

or 

 Column<int>* tmpInt = new Column<int>(each);
 csv[0].push_back(tmpString); 

有什么办法吗?或者更好的方法?

【问题讨论】:

  • 不可能。 Column&lt;std::string&gt;Column&lt;int&gt; 是不同的类型。你可以像这样实现变体.
  • 听起来您正在寻找类似 @​​987654327@ 或 std::vector&lt;std::variant&lt;std::string, int&gt;&gt; 的东西,无论如何 std::anystd::variant 是您应该研究的类
  • @j 它被标记为 C++11。
  • @273K 这是我尝试获取模板向量的方法,因为我不知道类型
  • 好的,既然你在 C++11 上,你也许可以看看 boost 库,它有 anyvariant 的 C++11 兼容版本,

标签: c++ c++11 c++-templates


【解决方案1】:

不可能直接这样做,你需要一个抽象基类/接口来做类似的事情。

也不要使用裸新/删除并更喜欢 std::unique_ptr 所以你的实例 当 vector 超出范围时得到清理。

演示:https://onlinegdb.com/lIhmM_RC3z

例子 :

#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 << "
";
    }

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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多