2012-12-06 89 views
2

我喜歡爲不同類型的對象的數量有限,檢索某些參數如下的機制我需要處理:有沒有辦法將數組行爲作爲靜態結構數據成員?

template <class T> 
struct params {}; 

template <> 
struct params<FooObj> 
{ 
    static const int paramA = 17; 
    static const int paramB = 29; 
}; 

稍後簡化了我的代碼,因爲在switch語句時,我處理處理不同的對象如果我得到一個FooObj那麼我需要做的就是這樣的事情:

typedef params<FooObj> paramsT; 

,然後在該代碼段我曾訪問參數通過paramsT::paramC或什麼是FooObj工作。

現在我遇到了一個對象,我有這樣的事情:

template <> 
struct params<BarObj> 
{ 
    static const int paramA = 0; 
    static const int paramB = 9; 
    static const int paramC = 17; 
    static const int paramD1 = 18; 
    static const int paramE1 = 20; 
    static const int paramD2 = 28; 
    static const int paramE2 = 30; 
    static const int paramD3 = 38; 
    static const int paramE3 = 40; 
    static const int paramD4 = 48; 
    static const int paramE4 = 50; 
    static const int paramD5 = 58; 
    static const int paramE5 = 60; 
    static const int paramD6 = 68; 
    static const int paramE6 = 70; 
}; 

,當我處理這個對象我開始寫類似如下:

typedef params<BarObj> paramsT; 
BarObj bar; 
//load the first 3 params via the above info into bar 

int a,b; 
for (int i = 1; i <= 6; ++i) 
{ 
    a = doSomethingA(bla + paramsT::paramD1); 
    b = doSomethingB(bla + paramsT::paramE1); 
    bla.paramD1 = functionOf(stuff,and,a,b); 
} 

,但當然上面有1硬編碼到它,它會理想地讀這樣的:

typedef params<BarObj> paramsT; 
BarObj bar; 
//load the first 3 params via the above info into bar 

int a,b; 
for (int i = 0; i < 6; ++i) 
{ 
    a = doSomethingA(bla + paramsT::paramD[i]); 
    b = doSomethingB(bla + paramsT::paramE[i]); 
    bla.paramD[i] = functionOf(stuff,and,a,b); 
} 

雖然像上面我需要的PARAMS模板專業化是這樣的:

template <> 
struct params<BarObj> 
{ 
    static const int paramA = 0; 
    static const int paramB = 9; 
    static const int paramC = 17; 
    static const int paramD[] = {18, etc..}; 
    static const int paramE[] = {20, etc..}; 
}; 

不編譯,因爲即使硬編碼的陣列非整數類型。有沒有一個簡單的補丁,希望看起來與我目前的使用情況有所不同?或者有一種方法來獲取數組內容?

+0

爲什麼使用模板化結構來保存硬編碼值而不是簡單的值表? –

回答

2

「靜態隱式內聯函數的靜態局部變量」黑客:

template<typename T> 
struct params; 
struct Bob; 
template<> 
struct params<Bob> { 
    static int paramE(unsigned int idx) { 
    static const int v[] = {18, 20, 22, 24}; 
    return v[idx]; 
    } 
}; 

#include <iostream> 
int main() { 
    for(auto i = 0; i < 4; ++i) 
    std::cout << params<Bob>::paramE(i) << "\n"; 
} 

注意,結果值不是「編譯時間常數」(即,不能用於諸如模板參數),但編譯器優化成常量是微不足道的。

+0

這是一個比我更清潔的解決方案,只要你不介意在索引([]語法)上調用函數(()語法) – Matt

+0

這真棒,我絕對喜歡這樣。 –

2

可以初始化靜態常量數組,不在類裏面,如this Stack Overflow question。我們面臨的挑戰是每個編譯單元都必須執行一次初始化操作,因此它通常是在源文件(.cpp)中完成的,因此它將遠離初始化的其餘部分,這相當嚴重。

+0

是的,我開始這樣做,但我同意它相當嚴重。 –

相關問題