簡體   English   中英

從函數返回通用類型數據

[英]Return Generic Type data from function

我寫了下面的代碼。 函數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;
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM