2012-10-02 43 views
9

我想做一些部分專業化的東西。我有一個tuple,我想從某個元素索引迭代到第一個元組索引,從tuple中的每個類型累積一個值。這似乎是使用遞歸模板實例化的一個簡單問題。具有整數參數的模板部分專業化

問題是,我似乎無法得到遞歸工作。爲了停止遞歸,我需要在元組索引0處部分專門化模板函數。這似乎很簡單,但它不起作用。

注意:我已經從示例中刪除了實際的tuple東西,因爲它是無關緊要的;這是模板專業化不起作用。

template<int Index, typename Tpl> 
size_t CalcInterleaveByteOffset(const Tpl &t) 
{ 
    size_t prevOffset = CalcInterleaveByteOffset<Index - 1>(t); 
    return prevOffset + sizeof(Tpl); 
} 

template<typename Tpl> 
size_t CalcInterleaveByteOffset<0, Tpl>(const Tpl &t) 
{ 
    return 0; 
} 

GCC simply says that this kind of specialization is not allowed.這是真的嗎?有沒有其他方式來處理這種事情?

回答

11

作爲一項規則,任何形式的部分模板特化不允許用於函數。不過,它允許上課。所以解決方案就是簡單地將你的函數移動到一個模板持有者類的靜態成員。

如果您需要推導模板參數,則可以創建一個調用模板類的包裝函數。

的結果是這樣的:

template<int Index, typename Tpl> 
class CalcInterleaveByteOffsetImpl 
{ 
    static size_t CalcInterleaveByteOffset(const Tpl &t) 
    { 
    // This is OK it calls the wrapper function 
    // You could also do 
    // size_t prevOffset = CalcInterleaveByteOffsetImpl<Index - 1, Tpl>::CalcInterleaveByteOffset(t); 
    size_t prevOffset = ::CalcInterleaveByteOffset<Index - 1>(t); 
    return prevOffset + sizeof(Tpl); 
    } 
}; 

template<typename Tpl> 
class CalcInterleaveByteOffsetImpl<0, Tpl> 
{ 
    static size_t CalcInterleaveByteOffset(const Tpl &t) 
    { 
    return 0; 
    } 
}; 

template<int Index, typename Tpl> 
size_t CalcInterleaveByteOffset(const Tpl &t) 
{ 
    return CalcInterlaveByteOffsetImpl<Index,Tpl>::CalcInterleaveByteOffset(t); 
} 
+0

我能區分不同類不同的成員變量這種方式?我猜可以嗎? – GameDeveloper