可变模板函数将数组类型强制转换为指针
variadic template function casts array type to pointer
此代码对指针和数组进行了部分用户专用化。
当显式调用数组专用化时,将返回所需的值。
但是,当使用可变模板函数时,数组参数会转换为指针,并调用指针专用化。
有没有办法让编译器(在本例中为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
}
您可以将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);
}
};
作为CCD_ 2。
相关文章:
- 转换指针引用的字符串
- 无法向上转换指针到指针参数
- 混合转换指针和引用
- 堆栈对象的强制转换指针
- 基类到派生模板类的强制转换指针,而不知道类型
- 删除类型转换指针的最佳方法
- 管理到本机值类转换:强制转换指针是否安全?
- 转换指针类型
- 为什么函数不能正确强制转换指针(从基类到派生类)
- 当我们递增下面的类型转换指针时会发生什么?
- 类型强制转换指针构造函数调用
- 如何转换(指针向量)-->(指向指针数组的指针)
- 如何从类功能转换指针
- 在C++对象中:我应该使用父类强制转换指针,还是应该使用实际类本身进行强制转换
- Delphi中的类型转换指针添加
- C++分段错误(核心转储)错误 - 强制转换指针/将函数值返回到线程
- 以C++和运算符优先级键入指向数组成员的强制转换指针
- C++动态强制转换指针的内存清理
- 转换指针和引用的好处
- 在c++中转换指针