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...>(); } T = {},即foo被称为foo<>();. 请注意,我不想修改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模板. 对于实例化 GetTypeSize< int> :: value GetTypeSize< double> :: value GetTypeSize< char> :: value GetSize<> :: value 那就是 sizeof(int)SIZEOF_DOUBLE sizeof(char)0 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- 标签出口在自定义UICollectionViewCell在Swift导致可选.没有
- OEL5.5(64bit)安装Oracle 11g R2 RAC教程(图文并茂超详细)
- 一些常用的正则表达式(待补充)
- c# – 如何防止iOS Safari输入标签中的自动大写?
- 看张亚飞《.Net for Flash FMS》的笔记<一>
- oracle – PL / SQL函数参数
- ruby-on-rails – Rails 3:如何获取当前布局的名称?
- ReactiveCocoa入门教程:第一部分
- "渐进式下载"的基础
- 让EF飞一会儿:如何用Entity Framework 6 连接Sqlite数据库