簡體   English   中英

C ++模板遞歸-如何解決?

[英]C++ template recursion - how to solve?

我再次陷入模板。

例如,我要實現guicell-系統。 每個guicell可以包含多個子guicell。 到目前為止,樹狀結構。 在std-c ++中,我會考慮。 喜歡:

template <typename T>
class tree
{
public:

    void add (T *o)     { _m_children.push_back (o); }
    void remove (T *o)  { ... };

    list<T*> _m_children;
};

class _cell : public tree<_cell>
{
public:
    _cell ()            { x = 0; y =0; }
    long                x,y;
};

但是現在我想走得更遠,如果編碼人員願意的話,使這些單元可引用。 因此,我基本上為此實現了refTree-類,該類也僅將指針(_cell *)作為輸入。

template <typename T>
class refTree
{
public:
   void add (T *o)      { _ref<T> r = o;  _m_children.push_back (r);  }
   void remove (T *o)       { ... }

   list<_ref<T> > _m_children;
};

此外,這仍然可以正常工作。 使用

class _cell : public refTree<_cell>
{
   :
};

無需更改用戶代碼,但現在將引用所有添加的_cell *,然后再將其添加到樹中。

很好,但是現在我希望能夠在_cell級別上選擇要使用的樹模板實現。 因此,這意味着我必須使_cell-類成為一個模板類,該模板類將模板類作為參數(所選的樹模板)。

template <template <typename> class __TyTree = tree>
class Cell : public __TyTree <Cell>     // cannot work - no question, Cell expects input
{
};

這就是遞歸問題-當然,編譯器無法解決該問題,因為Cell正在等待一棵樹-參數期望一個簡單類型的參數(應該是Cell ofc。正在等待一棵樹-參數正在期望一個簡單的.... )。

您明白了嗎-解決此類問題的正確解決方案是什么?

沒有遞歸。 Cell模板參數是__TyTree ,而不是__TyTree<Cell>

template <template <typename> class __TyTree = tree>
class Cell : public __TyTree <Cell<__TyTree> >
{
};

int main()
{
   Cell          mycell0; // error
   Cell<>        mycell1; // ok. tree is used
   Cell<tree>    mycell2;
   Cell<refTree> mycell3;
}

PS不應在__TyTree使用兩個前導下划線,因為它是C ++ Standard保留用於實現的目的。

您有兩個獨立的問題:單元中的內容以及單元之間的連接方式。 為此,您需要使用兩個單獨的數據結構。 換句話說,斷開連接的正確鏈接是從樹繼承單元格。 您節省的微小內存是不值得的-放棄“侵入式”方法。 單元不應該知道樹的固定方式。

暫無
暫無

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

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