大佬教程收集整理的这篇文章主要介绍了c – 如何处理空参数包的情况,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
// terminaTing general case for T being anything else template <class T> size_t getSize() { return sizeof(T); } // terminaTing special case for T=double template<> size_t getSize<double>() { return SIZEOF_DOUBLE; } // terminaTing special case for T=float template<> size_t getSize<float>() { return SIZEOF_FLOAT; } // recursive case template <class T,class U,class ...S> size_t getSize() { return getSize<T>() + getSize<U,s...>(); }
我希望getSize在调用时返回0
template <class ...T> void foo(T... arg) { size_t sizeOfTypes = getSize<T...>(); }
请注意,我不想修改foo的调用方式,尖括号必须保持在那里.我希望修改getSize,因为我在foo以外的几个函数中使用它.修改foo作为最后的手段.
template<typename T> struct GetTypeSize { enum { value = sizeof(T) }; }; template<> struct GetTypeSize<float> { enum { value = SIZEOF_FLOAT }; }; template<> struct GetTypeSize<double> { enum { value = SIZEOF_DOUBLE }; }; template<typename...> struct GetSize { enum { value = 0 }; }; template<typename Head,typename... Tail> struct GetSize<Head,Tail...> { enum { value = GetTypeSize<Head>::value + GetSize<Tail...>::value }; }; template<typename... T> void foo(T... arg) { size_t sizeOfTypes = GetSize<T...>::value; }
这具有在编译期间评估(总结)的优点.
我使用了两种结构.一个用于执行递归(GetSizE),另一个用于获取类型的实际大小(GetTypeSizE). GetSize< Head,Tail ...>的专业化只要有一个头(包不是空的)就会被实例化,并将Head中类型的大小添加到GetSize< Tail ...>的递归调用中.一旦没有Head,就会使用后备GetSize模板.
对于实例化
GetSize< int,double,char>它导致了
GetTypeSize< int> :: value GetTypeSize< double> :: value GetTypeSize< char> :: value GetSize<> :: value
那就是
sizeof(int)SIZEOF_DOUBLE sizeof(char)0
以上是大佬教程为你收集整理的c – 如何处理空参数包的情况全部内容,希望文章能够帮你解决c – 如何处理空参数包的情况所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。