2014-11-21 83 views
3

我目前正面臨一個嵌套的模板參數問題,我想訪問它,但我不確定這是否可能。這裏是對問題的描述:訪問嵌套模板參數

我有一個類「直方圖」從一個庫,我沒有影響。這個類看起來像:

template<int N> 
struct Histogram 
{ 
    float histogram[N]; 
    static int descriptorSize() { return N; } 
}; 

現在我要創造我自己的主成分分析類,它應該能夠處理任意大小的柱狀圖:

template<template<typename> class HistogramT> 
class PCA { 

    // I'd like to pass on the nested template parameter here 
    typedef typename Matrix< float , N , N > MatrixNf; 

    // ... 
} 

類的最終實例會看像:

PCA<Histogram<153> > pca; 

我現在的問題是如何,或者即使,它是可以訪問的Histogram<int N>模板參數N我PCA類裏面呢?

回答

4

如果你想做的事:

PCA<Histogram<153> > pca; 

然後PCA應該是:

template <typename Histogram> 
class PCA { ... }; 

因爲Histogram<153>是一個完整的類型,而不是一個模板。至於如何獲得數字?只要寫一個類型特點:

template <typename T> struct get_histogram_size; 

template <int N> 
struct get_histogram_size<Histogram<N> > { 
    static const int value = N; 
} 

用法:

template <typename Histogram> 
class PCA { 
    static const int N = get_histogram_size<Histogram>::value; 
    typedef typename Matrix< float , N , N > MatrixNf; 
    // ... 
}; 
+0

我認爲這是最通用的解決方案,因爲可以在不觸及PCA類的情況下擴展特徵。所以任何「類型」都可以傳遞給PCA類,只要其行爲與Histogram類相同即可。 – sled 2014-11-21 12:45:31

3
template <class T> 
class PCA; 

template <int N> 
class PCA<Histogram<N> > 
{ 
    typedef typename Matrix< float , N , N > MatrixNf; 
    // ... 
}; 

PCA<Histogram<153> > pca; 
+0

不幸的是我只能接受一個答案,我只是想指出,你的答案是完美的有效。我沒有選擇你的原因是它將PCA類限制爲必須可轉換爲直方圖類的類型。否則,我需要創建另一個專門的PCA類並重新實現它 - 通常是可以的,但在這種情況下,該類是明確定義的算法,並且僅取決於矢量維N.因此,另一個類的專業化幾乎爲1 :1份。 – sled 2014-11-21 13:09:15

1

首先,你的模板的模板參數不正確。它應該有int,而不是typename

template<template<int> class HistogramT> 
class PCA 

但現在你可以不寫

PCA<Histogram<154>> 

因爲Histogram<154>不是一個模板,這是一類。我建議你只需添加另一個參數,就像這樣:

template<template<int> class HistogramT, int N> 
class PCA 

並使用

PCA<Histogram, 154> 

直方圖模板不寫得很不錯。如果是這樣,它會提供類似:

static const int size = N; 

裏面,這樣你可以這樣做:

template<class HistT> 
    class PCA 
    { 
     //here, use HistT::size for N. 
    }