簡體   English   中英

C ++中具有多態模板類的未知方法返回類型

[英]Unknown Method Return Type with Polymorphic Template Classes in C++

我一直在努力弄清楚如何實現以下類。 本質上,我想實現的目標是:-主類用於Matrix-數據應存儲在Matrix對象的外部-Matrix_Data應該能夠支持浮點和雙精度類型

我一直在努力弄清楚如何使用模板來實現,但是我似乎無法弄清楚。 這大致說明了我的意圖:

template <typename T>
class Matrix {
private:
   IMatrix_Data* m_data;
...
}

class IMatrix_Data { 
XXX Get_Data();  // <== The return type should be float or double, as appropriate
...
}

有人可以給我一些建議和指導嗎?

更新:

我已經按照@ruslo的建議更新了課程。 我現在面臨的問題是將Matrix和Matrix_Data更改為模板類會導致對大量類的連鎖效應。 我承認我在模板方面的經驗非常有限-也許我正在以錯誤的方式進行操作,或者這也許是正確的方法,但對我而言似乎是錯誤的。

基本上,似乎任何隨后使用Matrix的類或存儲在矩陣中的數據都必須是模板類。 我知道我可以使用typedef(或使用語句)清理代碼的外觀,但是我認為這不會改變類的層次結構,對嗎?

作為一些我使用矩陣的類的示例:

template <typename T>
class Vector : Matrix<T>

template <typename T>
class Input {  // <- this class is intended to be used as a base class for runtime polymorphism
    Vector<T>::DataType Get_Data();
    /* Rest of class */
};

class Parameterized_Input{ // <- this class is intended to be used as a base class for runtime polymorphism
};

template <typename T>    
class Input_Iterator {
    /* ...
           */
    std::stack<std::vector<Input<T>* >::iterator > parent_nodes; // Part of the iteration algo
}

我在這里感到很困惑---這超出了我之前做過的任何事情,我希望有人可以在實施以及改進方面的任何建議方面為我指明正確的方向該設計。

例如,正如我在上面的代碼中指出的那樣,Input類旨在用作抽象基類,以允許運行時多態。 派生類將實現此接口(並可能實現Parameterized_Input)以創建不同類型的Inputs。 但是,由於輸入的返回類型與Matrix_Data的返回類型相同(即,當前為未知類型T),看來我也需要將每個派生類也都放入模板中。

不幸的是,這時候,我覺得我需要根據情況靈活使用浮點數來提高性能,或者使用double來提高精度。 如果我可以排除其中之一,那肯定會簡化一切。

替代方案-沒有模板,從總體上看似乎更簡單(基於我可能的錯誤理解):

class Matrix{
    IMatrix_Data* m_data;
    /*  ...   */
}

class IMatrix_Data{
    /*  ...   */
    template <typename T>
    Get_Data(int _row,int _col) { return static_cast<T>( this->ncols * _col + _row ); }
}

namespace matrix_data {
    class MD_Double : public IMatrix_Data{
        /*  ...   */
    }

    class MD_Double : public IMatrix_Data{
        /*  ...   */
    }

我已嘗試在上面提供足夠的信息,但是如果有任何遺漏,請告知我,我們將很樂意提供其他說明和/或信息。

感謝和問候,Shmuel

GetData的返回值可以是模板參數:

template <class T>
class MatrixImpl {
 public:
  typedef T DataType;
  DataType GetData();
};

template <class T>
class Matrix {
 public:
  typedef MatrixImpl<T> Impl;
  typedef typename Impl::DataType DataType;

  DataType GetData() {
    return data_->GetData();
  }

 private:
  Impl* data_;
};

暫無
暫無

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

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