首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >根据sizeof类型进行模板专门化

根据sizeof类型进行模板专门化
EN

Stack Overflow用户
提问于 2010-08-20 16:23:12
回答 3查看 9.3K关注 0票数 18

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

与此类似的内容(省略了类型转换),但没有if/elseif if:

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...

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-08-20 16:35:16

你不需要SFINAE或类型特征。模板专门化就足够了。当然,它必须针对结构进行专门化,因为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); }
票数 20
EN

Stack Overflow用户

发布于 2010-08-20 16:39:03

只需创建一个以大小作为模板参数的辅助类:

#include <cstddef>
#include <iostream>


template<std::size_t Size>
struct ByteSwapper { };

template<>
struct ByteSwapper<2> {
  static unsigned short swap(unsigned short a) {
    return 2 * a;
  }
};

template<typename T>
T byteswap(const T& a) {
  return ByteSwapper<sizeof(T)>::swap(a);
}


int main() {
  unsigned short s = 5;
  std::cout << byteswap(s) << std::endl;
  unsigned int i = 7;
  // std::cout << byteswap(i) << std::endl; // error
}
票数 4
EN

Stack Overflow用户

发布于 2010-08-20 17:19:42

我可以提出以下方法:它的好处是,如果操作数的大小不是有效的,就不需要throw异常。它就是不能链接。这样您就可以在构建时进行错误检查。

template<int size>
void byteswapInPlace(void* p);

template<> void byteswapInPlace<1>(void* p) { /* do nothing */ }

template<> void byteswapInPlace<2>(void* p)
{
    _byteswap_ushort((ushort*) p);
}

template<> void byteswapInPlace<4>(void* p)
{
    _byteswap_ulong((ulong*) p);
}

template<> void byteswapInPlace<8>(void* p)
{
    _byteswap_uint64((uint64*) p);
}


template<class T>
T byteswap(T & swapIt)
{
    byteswapInPlace<sizeof(T)>(&swapIt);
    return swapIt;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/3529263

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档