2012-07-03 180 views
2

我想需要一個模板類型是一個模板類型:嵌套模板類型

template < template < int beta, typename gamma> class alpha > 
gamma foo() 
{ 
    // do stuff with beta, gamma 
    gamma c[beta]; 
    alpha a(); 
    alpha b(); 
} 

我想有γ和β由我給的值決定,所以:

foo< hello<2,double> >() 

會創建一個hello<2,double>對象而不是alpha,而c將是包含2個元素的double的數組。

所以,我想從傳遞給foo的模板類中提取模板參數。

我該怎麼做?

+1

您的最終目標是什麼? – GManNickG

+0

問題不明確。另外,'alpha a();'聲明瞭一個函數而不是一個對象。你真的是這個意思嗎? – iammilind

+1

我對代碼片段中的1和後續代碼片段中的2感到困惑。你可能在那裏有一個錯字? – Turix

回答

4

您提供的模板聲明採用了所謂的模板模板參數(模板類型的模板參數)。然而,您提供的用法示例嘗試將「普通」類作爲參數傳遞(一旦所有模板參數都已修復,模板類將變成「普通」類,它不再是模板)。

這意味着模板參數不是你所需要的。模板 - 模板參數服務於完全不同的目的。 (我不會在這裏詳述)。

您的問題的一種可能的解決方案是要求參數類通過嵌套類型和常量公開其模板參數。即您hello模板必須包含嵌套的不斷beta_value和嵌套類型名gamma_type

template <int BETA, typename GAMMA> class hello 
{ 
public: 
    static const int beta_value = BETA; 
    typedef GAMMA gamma_type; 
    ... 
}; 

在這種情況下,你的功能將與普通型模板參數

template <typename ALPHA> typename ALPHA::gamma_type foo() 
{ 
    // do stuff with beta, gamma 
    typename ALPHA::gamma_type c[ALPHA::beta_value]; 
    ALPHA a(); 
    ALPHA b(); 
} 

聲明如果一些用戶忘記按照慣例,編譯器將拒絕編譯foo並強制該用戶更新其參數類的定義。