gpt4 book ai didi

c++ - 根据 sizeof 类型的模板特化

转载 作者:IT老高 更新时间:2023-10-28 22:02:11 24 4
gpt4 key购买 nike

我想提供一个模板化函数,它根据模板类型的大小改变其实现(->特化)。

类似的东西(省略类型转换),但没有 if/elseif:

template<class T>
T byteswap(T & swapIt)
{
if(sizeof(T) == 2)
{
return _byteswap_ushort (swapIt);
}
else if(sizeof(T) == 4)
{
return _byteswap_ulong(swapIt);
}
else if(sizeof(T) == 8)
{
return _byteswap_uint64(swapIt);
}
throw std::exception();
}

我知道有很多途径可以实现我的目标,但由于我尝试了解 SFINAEtype traits 我对使用这些技术的解决方案特别感兴趣在编译时决定选择哪个特化以及不允许哪些调用。

也许实现一个类特征 is_4ByteLong 并使用 boost::enable_if...

我不得不承认,我现在被困住了,所以我感谢你的帮助或建议

最佳答案

您不需要 SFINAE 或类型特征。 Vanilla 模板特化就足够了。当然它必须专门用于结构,因为 C++(98) 不支持函数模板部分专门化。

template <typename T, size_t n>
struct ByteswapImpl
/*
{
T operator()(T& swapIt) const { throw std::exception(); }
}
*/ // remove the comments if you need run-time error instead of compile-time error.
;

template <typename T>
struct ByteswapImpl<T, 2> {
T operator()(T& swapIt) const { return _byteswap_ushort (swapIt); }
};

// ...

template <typename T>
T byteswap(T& swapIt) { return ByteswapImpl<T, sizeof(T)>()(swapIt); }

关于c++ - 根据 sizeof 类型的模板特化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3529263/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com