2010-11-16 31 views
1

我原來有許多信號處理過濾器類,除了定義過濾器特性的幾個常量之外,所以我決定將它們更改爲模板類以實現可維護性和可擴展性。在這種情況下,存在性能和內存管理的原因,喜歡使用模板而不是構造函數參數;它適用於嵌入式系統。爲實例化的模板創建一個別名

因此我有一個模板類的形式爲:

template <int SIZE, int SCALE_MULTIPLIER, int SCALE_SHIFT> 
class cBoxcarFilter 
{ 
public: 
    // Allow access to SIZE at runtime. 
    static const int FILTER_SIZE = SIZE ; 
    ... 
} 

這一點我明確實例因此,例如:

template class cBoxcarFilter<8, 1, 3> 

問題是,當我需要訪問它需要FILTER_SIZE成員:

cBoxcarFilter<8, 1, 3>::FILTER_SIZE 

它寧可訪問FILTER_SIZE冗餘,因爲它必須在論據中重複。我對這個問題的解決方案是這樣的:

// Create an alias for filter 
#define cSpecialistBoxcarFilter cBoxcarFilter<8, 1, 3> 
template class cSpecialistBoxcarFilter ; 

那麼我就可以這樣訪問FILTER_SIZE:

cSpecialistBoxcarFilter::FILTER_SIZE 

這也讓每個過濾器實例有意義的唯一名稱的優勢,因爲在原來的非模板版本,但是對於使用看起來像一個類的宏來說,它似乎有點臭,因爲它具有不同的範圍語義。

是否有更好的方式爲模板實例創建別名類名?

回答

10

是的,typedef

typedef cBoxcarFilter<8, 1, 3> cSpecialistBoxcarFilter; 
+0

這是顯而易見的,現在你說了吧! ;)必須睡着。謝謝。 – Clifford 2010-11-16 17:37:25

+1

請注意,顯式模板實例化仍必須使用完整形式。 '模板類cBoxcarFilter <8, 1, 3>;'。但在其他地方,您可以使用此typedef作爲專門類類型的名稱。 – aschepler 2010-11-16 17:46:03

0

你可以問你的類的具體實例(對象),其濾鏡尺寸:

template <int X> class A 
{ 
    public: 
    int y; 
    static const int size = X; 
}; 

int main(int, char**) 
{ 
    A<3> a; 
    printf("size is %i\n", a.size); 
} 

結果

size is 3 
+2

這應該是'.',而不是'::'。噢,那可以用於靜力學,但不是例如類型定義。 – 2010-11-16 17:16:00

+0

@Oli感謝您指出錯誤。 – 2010-11-16 17:23:27

+0

兩者。和::似乎適用於typedefs – DanDan 2010-11-16 17:26:08