C&C++   发布时间:2022-04-03  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了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模板.

对于实例化
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,请注明来意。