函数返回通用类型数据
问题描述:
我已经写了下面的代码。功能func()打印标题和数据。函数返回通用类型数据
class ICell
{
public:
wstring header;
virtual void Fetch() = 0;
};
template <class T>
class Cell : public ICell
{
public:
//wstring header;
T data;
void Fetch()
{
wcout<< header << L": ";
cout<<data<<endl;
}
// implementation of cell methods
};
class Row
{
public:
vector <ICell *> cells;
};
有什么办法可以在函数中返回数据而不是打印吗?如果是这样,哪部分代码应该被修改? 在此先感谢。
int main()
{
Cell<int>c1;
Cell<double>c2;
c1.header = L"Roll", c1.data = 100;
c2.header = L"CGPA", c2.data = 3.5;
Row r;
r.cells.push_back(&c1);
r.cells.push_back(&c2);
vector <ICell *>::iterator it;
for(it=r.cells.begin();it!=r.cells.end();it++)
{
//checkt type of it wherther it points Cell<int> or Cell<double>
}
return 0;
}
我在这里改变了我的问题。在循环内部的main()中,我如何检查'it'指向的对象类型?
谢谢大家的耐心和帮助我:)
答
最简单的方法是使用dynamic_cast
:
vector <ICell *>::iterator it;
for(it=r.cells.begin();it!=r.cells.end();it++)
{
Cell<int>* cell_i= dynamic_cast<Cell<int>*>(*it);
if(cell_i)
{
do_something(cell_i->data);
continue;
}
Cell<double>* cell_d= dynamic_cast<Cell<double>*>(*it);
if(cell_d)
{
do_something(cell_d->data);
continue;
}
}
更好的办法是使用访问者模式:
class ICellVisitor; //declaration for ICell to understand ICell* pointer
class ICell
{ public:
~ICell(){}; // important
std::wstring header;
virtual void visit(ICellVisitor* v) = 0;
};
template <class T> class Cell; // for Cell<T>* pointer
class ICellVisitor
{ public:
virtual void visit(Cell<int>* c) = 0;
virtual void visit(Cell<double>* c) = 0;
virtual void visit(Cell<float>* c) = 0;
virtual void visit(Cell<long long>* c) = 0;
};
template <class T> class Cell : public ICell
{ public:
//wstring header;
T data;
void visit(ICellVisitor* v)
{
std::wcout<< header << L": ";
v->visit(this);
}
// implementation of cell methods
};
class Row
{ public:
std::vector <ICell *> cells;
};
现在,我们需要定义具体的访客保持每种类型的算法:
class MyCellVisitor: public ICellVisitor
{ public:
void visit(Cell<int>* c){
std::wcout<<"(int)"<<c->data<<std::endl;
}
void visit(Cell<double>* c){
std::wcout<<"(double)"<<c->data<<std::endl;
}
void visit(Cell<float>* c){
std::wcout<<"(float)"<<c->data<<std::endl;
}
void visit(Cell<long long>* c){
std::wcout<<"(long long)"<<c->data<<std::endl;
}
};
int main()
{
Cell<int>c1;
Cell<double>c2;
c1.header = L"Roll", c1.data = 100;
c2.header = L"CGPA", c2.data = 3.5;
Row r;
r.cells.push_back(&c1);
r.cells.push_back(&c2);
MyCellVisitor visitor;
std::vector <ICell *>::iterator it;
for(it=r.cells.begin();it!=r.cells.end();it++)
{
(*it)->visit(&visitor);
}
return 0;
}
+0
谢谢麻烦。特别为新的模式(对我来说)代码。 – 2013-04-25 13:03:32
将'void Fetch();'改为'T Fetch();' – 2013-04-25 11:44:53
您可能会返回一串正在输出的数据,也许? – 2013-04-25 11:44:56
@AlokSave:如果'T'和'header'都是作为一个单元返回的话,则不应该... – 2013-04-25 11:45:30