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