2014-04-29 60 views
1

此代碼具有指針和數組的部分用戶特化。可變參數模板函數將數組類型轉換爲指針

當顯式調用數組特化時,返回期望值。

但是,當使用可變參數模板函數時,數組參數被轉換爲指針,並調用指針專用化。

有沒有辦法讓編譯器(在這種情況下是g ++ 4.8.1)不能執行該轉換?

還是有不同的方式來返回不使用模板專業化的「總大小」?

#include <iostream> 

template <typename T, typename... Params> 
struct TestTemplate 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (T) + TestTemplate<Params...>::Sizeof(); 
    } 
}; 


template <typename T> 
struct TestTemplate<T> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (T); 
    } 
}; 


template <typename T, typename... Params> 
struct TestTemplate<T*, Params...> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (T) + TestTemplate<Params...>::Sizeof(); 
    } 
}; 


template <typename T> 
struct TestTemplate<T*> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (T); 
    } 
}; 


template <typename T, size_t N, typename... Params> 
struct TestTemplate<T[N], Params...> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return N * sizeof (T) + TestTemplate<Params...>::Sizeof(); 
    } 
}; 


template <typename T, size_t N> 
struct TestTemplate<T[N]> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return N * sizeof (T); 
    } 
}; 


template <typename... Params> 
size_t GetSizeof (Params... params) 
{ 
    return TestTemplate<Params...>::Sizeof(); 
} 


struct TestType 
{ 
    double x = 0., y = 0.; 
    char buf[64]; 
}; 

int main (int, char *[]) 
{ 
    std::cout << TestTemplate<int[10]>::Sizeof() << std::endl; // prints 40. OK 
    std::cout << GetSizeof (2, 3, 4) << std::endl; // prints 12. OK 

    TestType tt; 
    std::cout << GetSizeof (&tt, 1) << std::endl; // prints 84. OK 

    int int_arr[10]; 
    std::cout << GetSizeof (int_arr, 1) << std::endl; // prints 8, want 41 
} 
+0

當數組傳遞給函數時,數組衰減爲指針。如果你想把它們保存爲數組,你必須通過引用來引用它們。這必須在'GetSizeof()'級別處理。 – Angew

回答

1

可以更換您的GetSizeof是:(https://ideone.com/jqXT4s

template <typename... Params> 
size_t GetSizeof (const Params&... params) 
{ 
    return TestTemplate<Params...>::Sizeof(); 
} 

一旦你這樣做,你可以簡單地使用:

template <typename T, typename... Params> 
struct TestTemplate 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (typename std::remove_pointer<T>::type) + TestTemplate<Params...>::Sizeof(); 
    } 
}; 

template <typename T> 
struct TestTemplate<T> 
{ 
    static size_t Sizeof() 
    { 
     std::cout << __FILE__ << ':' << __LINE__ << std::endl; 
     return sizeof (typename std::remove_pointer<T>::type); 
    } 
}; 

sizeof(T[N]) == N * sizeof(T)

+0

現在const *正在讓我失望。我仍然在嘗試不同的東西。 [https://ideone.com/uUSyaI](https://ideone.com/uUSyaI) –

+0

使用'const params&'而不是'Params &&',它可以工作。回答編輯。 – Jarod42

相關問題