加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 如何处理空参数包的情况

发布时间:2020-12-16 09:56:57 所属栏目:百科 来源:网络整理
导读:我有以下代码用于获取包中所有原始类型的大小(我以特殊方式处理浮点数和双精度数),但是当程序包为空时我的程序无法编译. // terminating general case for T being anything elsetemplate class Tsize_t getSize(){ return sizeof(T);}// terminating specia
我有以下代码用于获取包中所有原始类型的大小(我以特殊方式处理浮点数和双精度数),但是当程序包为空时我的程序无法编译.

// 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模板.

对于实例化
GetSize< int,double,char>它导致了

GetTypeSize< int> :: value GetTypeSize< double> :: value GetTypeSize< char> :: value GetSize<> :: value

那就是

sizeof(int)SIZEOF_DOUBLE sizeof(char)0

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读