有没有一种方法可以向此向量添加元素?

时间:2020-06-26 09:26:50

标签: c++ oop templates inheritance shared-ptr

我有一个clRelease*类,一个模板Column.h和一个ColumnImpl.h

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

template <typename T> class ColumnImpl : public Column {
public:
    ColumnImpl() : Column() {}
    void addElem(const T& elem_to_add);
protected:
    vector<T> _data;
};

我现在想做的是,使用方法class Tab { public: Tab(); ~Tab() {}; template <typename S> void addElemToCol(const string & col_name, const S & data_to_add); private: map<string, shared_ptr<Column>> _columns; }; ColumnImpl.h内的模板矢量中添加元素,然后在addElem内调用它。

要做到这一点(在addElemToCol内部):

addElemToCol

但是在这里,我意识到我没有if (this->colIsPresent(col_name)) { const auto & it = _columns.find(col_name); it->second.get(). } 方法...如何解决此问题?

编辑1:

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

addElem

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

Database

这是一种 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); } 方法:

Tab

每个类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

1 个答案:

答案 0 :(得分:1)

您收到此错误消息是因为即使仅使用一个开关块,所有的开关块都需要编译。 p_int->addElem(data_to_add);仅在data_to_add的类型与相应的ColumnImpl模板类型匹配时才可以编译,并且仅在其中的一种情况下才适用。

由于您知道S是什么,因此实际上不需要进行任何类型检查。您可以完全消除switch,而只需查找ColumnImpl<S>。我们还可以让函数返回一个布尔值,指示添加元素是否成功。

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