2013-07-30 65 views
6

有什麼辦法可以獲得遞歸模板類型嗎?我有一個容器,我想指定一個底層存儲策略。內部模板必須使用外部模板的類型,所以它會在類型定義中產生一個循環 - 這是無法指定的。容器/類型名轉發的遞歸模板類型

關於我想要的東西:

template<typename C> 
struct inner { 
    C * object[16]; 
}; 

template<typename T, typename Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 

C++ 11的解決方案是罰款(雖然我仍然在GCC 4.6.3)。

+3

有一種叫做「好奇遞歸模板模式」(CRTP)的東西?也許它會幫助,不確定... http://en.wikipedia.org/wiki/Curiously_recurring_template_pattern – Jimbo

+0

這種遞歸數據類型將有哪些新行爲將它與鏈接列表區分開來? – abiessu

+0

@abiessu,我目前的用途實際上是基數樹。每個節點都有一個如何到達下一個節點的索引,「內部」是指定該索引的策略。也就是說,模板允許說明孩子是如何管理的,而不是固定的紅黑,散列或其他策略。 –

回答

5

你需要告訴編譯器Inner是一個模板類:

template<typename T, template<typename> class Inner> 
struct container { 
    T value; 
    Inner<container> holder; 
}; 
+0

爲什麼它必須是Inner之前的'class'?我明白這不是一個通用的參數了,而是一個類的類型,儘管我期望'struct'也可以工作。因爲它不,我不確定我是否理解。 –

+0

@ edA-qamort-ora-y模板是如何工作的。您可以使用通用的'typename'關鍵字或'class'。然而,在這種情況下,因爲'Inner'本身就是一個模板類,所以它必須被聲明爲模板'class'。您可以定義模板化結構,但不能在模板參數列表中定義。 –

0

我不知道爲什麼你要添加的Inner類型模板參數,因爲你定義holder是一種類型的基於Containerinner,這兩者都可以在您聲明持有者的地方提供。

您打算使用struct inner以外的任何其他類型作爲模板參數嗎?Container?如果沒有,下面的簡化代碼編譯和VS2010跑了我:

#include <vector> 
#include <stdio.h> 

template <typename C> 
struct inner{ 
    C * objects[16]; 
    bool hasobj; 

    inner():hasobj(false){} 
}; 

template <typename T> 
class Container { 
    inner<Container> holder; 
    T value; 
public: 

    Container(const T& valueP){ 
     value = valueP; 
    } 
    void AddChild(Container* rhs){ 
     holder.objects[0] = rhs; //Always using first location, just for example 
     holder.hasobj = true; 
    } 

    void PrintStuff()const{ 
     if(holder.hasobj){ 
      holder.objects[0]->PrintStuff(); 
     } 
     printf("VAL IS %d\n", value); 
    } 
}; 

int main(){ 
    Container<int> c(10); 

    Container<int> c1(20); 
    c1.AddChild(&c); 
    c1.PrintStuff(); 
} 

基本上,這是假設container總是在inner來定義holder,這有助於擺脫多餘的模板參數,當定義Container。希望這有助於:) 阿倫

+0

關於Inner,是的,那是目的,你可以選擇用於內部類的類型。 –