C++ 模板 : Calling member function of derived template class from base class

标签 c++ templates inheritance polymorphism

我目前正在开发一个电子表格应用程序,但我在使用模板时遇到了问题。 模板的每个单元格都可以包含一个可以是任何标准类型的变量。

相关类是SpreadSheet ,其最重要的成员变量是SheetCells , 其中有 输入 vector< vector<CellBase*> > . CellBase类是一个抽象类,CellField<T>是 derived,后者是模板类,存储一个单元格对应的一条数据 电子表格。

我还有一个类(class),SheetView ,最终必须显示电子表格。 (为了简单起见, 假设这个类可以完全访问所有其他类。)这个类并不真正关心什么类型 每个单元格的值都是,因为它无论如何都会将所有内容转换为字符串。但是,我的问题是写作 SpreadSheet 的成员函数返回一个包含数据的字符串。我的第一个想法是写一个函数 std::string SpreadSheet::getDataFromSheet(int row, int column)SheetView会调用,然后那个函数就可以了 return (std::to_string(SheetCells[row][column] -> getData())) , 其中getData()CellField<T> 的成员函数, 回归 类型的东西 T . 然而,由于 SheetCells包含指向 CellBase 的指针类,我必须getData CellBase的成员, 但这是不可能的,因为我想要 getData()返回 T 类型的变量, 与模板类同类型 CellField .

所有类定义的相关部分如下。

//SpreadSheet

class Spreadsheet
{

private:
    int _height, _width;

public:
    Spreadsheet(int newHeight, int newWidth);
    ~Spreadsheet();
    string getData(int row, int column);
    vector< vector<CellBase*> > SheetCells;

};



//CellBase

class CellBase
{
    public:
        CellBase();
        virtual ~CellBase();
};



//CellField

template<typename T>
class CellField : public CellBase
{
    public:
        CellField(T newValue);
        virtual ~CellField();
        T getData();
        T _value;
};

简而言之,我希望能够调用 getData()来自 SpreadSheet , 但后者的成员变量 只包含指向 CellBase 的指针类(但这些类实际上是 CellField<T> 类型)。

我看过类似的问题,但似乎都没有解决基类成员函数调用模板的问题 class<T>函数,其中后者和前者需要返回类型为 T 的变量.也许void*指针会起作用吗?

最佳答案

由于 C++ 是一种强类型语言,您不能以这种方式直接调用它们,因为编译器无法确定函数的返回值是什么。

您需要做的是,将其全部映射到一个通用接口(interface)。您应该问的问题是:我真正需要从 CelField 获得的信息是什么?也许您只需要值的字符串表示形式,那么您可以这样做:

class CellBase
{
    virtual std::string getData()=0;
};

template<typename T>
class CellField : public CellBase
{
    std::string getData(){//some implementation}
};

另一种选择是使用 boost::any ,它能够包含您喜欢的任何类型。如果除了将返回值传递给采用“任意参数”的其他函数之外不需要实际干扰返回值,这将特别有用。然而,为了真正使用该值,您仍然必须使用 boost::any_cast<T>() 将其转换为特定类型。因此需要知道您期望哪种类型,并在类型错误时进行适当的错误处理。

关于C++ 模板 : Calling member function of derived template class from base class,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35747743/

相关文章:

c++ - 如何从 boost 多数组中获取最大/最小元素

c++ - 提高远离相机的深度缓冲精度

c++ - C++ 中的析构函数和构造函数顺序

java - 防止打印多个对象

c# - 部分覆盖子类中的虚拟自动属性

c++ - 在这种情况下,为什么 STL priority_queue 并不比 multiset 快多少?

c++ - ld 找不到可用的库

c++ - 模板和常量字符串

c++ - 显式模板特化错误

html - 模板中的 bson.ObjectId