2014-04-29 61 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

相关问题