C++ 有没有办法向这个向量添加元素?

C++ 有没有办法向这个向量添加元素?,c++,oop,templates,inheritance,shared-ptr,C++,Oop,Templates,Inheritance,Shared Ptr,我有一个classColumn.h、一个模板ColumnImpl.h和一个Tab.h class Column { public: Column() {} virtual ~Column() {}; virtual string getType() = 0; }; 但在这里,我意识到我没有添加元素的方法。。。我如何解决这个问题 编辑1: 这就是我检查类型并将其添加到向量中的方式: int data; data_stream >> data; if (!da

我有一个class
Column.h
、一个模板
ColumnImpl.h
和一个
Tab.h

class Column {
public:
    Column() {}
    virtual ~Column() {};
    virtual string getType() = 0;
};

但在这里,我意识到我没有添加元素的方法。。。我如何解决这个问题

编辑1:

这就是我检查类型并将其添加到向量中的方式:

int data;
data_stream >> data;
if (!data_stream.fail()) {
    if (target_database.tabIsPresent(tab_name)) {
        target_database.addElemToColOfTab(tab_name, col_name, data);
    }
这是一种
数据库
方法:

    template <typename D> void addElemToColOfTab(const string & tab_name, const string & col_name, const D& data_to_add) {
        const auto & it_target_tab = _tables.find(tab_name);
        it_target_tab->second.addElemToCol(col_name, data_to_add);
    }
template <typename S> void addElemToCol(const string & col_name, const S & data_to_add) {
    if (this->colIsPresent(col_name)) {
        const auto & it = _columns.find(col_name);
        switch (Type2Int(it->second->getType())) {
            case OptionInt: {
                ColumnImpl<int>* p_int = dynamic_cast<ColumnImpl<int> *>(it->second.get());
                if (p_int != nullptr) {
                    p_int->addElem(data_to_add);
                }
                break;
            }
            case OptionFloat: {...}
            // [...] All the other Columns
        }
    }
}
每个类
IntColumn
FloatColumn
都有自己的实现:

void addElem(const int& elem_to_add) { _data.push_back(elem_to_add); } // this is for IntColumn

出现此错误是因为即使只使用一个开关块,所有开关块都需要编译<代码>p_int->addElem(数据添加)数据类型与相应的
ColumnImpl
模板类型匹配时,code>才能编译,并且只有在其中一种情况下才是如此

因为您知道什么是
S
,所以实际上不需要进行任何类型检查;您可以完全取消
开关
,只需查找
ColumnImpl
。我们还可以让函数返回一个bool,指示添加元素是否成功

template <typename S>
bool addElemToCol(const string & col_name, const S & data_to_add) {
    const auto & it = _columns.find(col_name);
    if (it != _columns.end()) {
        auto ci = dynamic_cast<ColumnImpl<S> *>(it->second.get());
        if (ci != nullptr) {
            ci->addElem(data_to_add);
            return true;
        }
    }
    return false;
}
模板
布尔加法器(常量字符串和列名称,常量S和数据添加){
const auto&it=\u columns.find(col\u name);
if(it!=\u columns.end()){
自动ci=dynamic_cast(it->second.get());
if(ci!=nullptr){
ci->addElem(从数据添加到数据添加);
返回true;
}
}
返回false;
}

如果不向
列添加一些虚拟方法,或者不知道
ColumnImpl
实例的
t
是什么,您就不能这样做。我应该向
列添加一个虚拟方法,然后将其实现到
ColumnImpl
?(这应该是一个模板方法,对吗?)模板成员函数不能是虚拟的。你是对的,我刚刚得到
“virtual”不能在成员函数模板上指定
。。。我能做什么呢?我试着不把它标记为虚拟的,做我需要做的。。。这似乎有效,但我不知道是否正确非常感谢你的耐心,它工作得非常好!
template <typename S> void addElemToCol(const string & col_name, const S & data_to_add) {
    if (this->colIsPresent(col_name)) {
        const auto & it = _columns.find(col_name);
        switch (Type2Int(it->second->getType())) {
            case OptionInt: {
                ColumnImpl<int>* p_int = dynamic_cast<ColumnImpl<int> *>(it->second.get());
                if (p_int != nullptr) {
                    p_int->addElem(data_to_add);
                }
                break;
            }
            case OptionFloat: {...}
            // [...] All the other Columns
        }
    }
}
void addElem(const int& elem_to_add) { _data.push_back(elem_to_add); } // this is for IntColumn
template <typename S>
bool addElemToCol(const string & col_name, const S & data_to_add) {
    const auto & it = _columns.find(col_name);
    if (it != _columns.end()) {
        auto ci = dynamic_cast<ColumnImpl<S> *>(it->second.get());
        if (ci != nullptr) {
            ci->addElem(data_to_add);
            return true;
        }
    }
    return false;
}