如何使用type_traits或模板功能专门化来巩固模板方法

johnco3

我正在尝试从类似于以下所示类的类中合并许多非常相似的函数方法,我认为有效实现此目的的最佳方法是通过使用模板,再结合使用模板功能专门化或类型特征。我是模板专业化和类型特征的新手,但是我了解基本概念,因此正要我就这些细节寻求一些指导。无论如何,我的类都是一个智能缓冲区类,它具有许多与下面列出的方法签名相似的方法签名。

class OldSafeBuffer {
public:
    intmax_t writeAt(const intmax_t& rIndex, const uint32_t val32);
    intmax_t writeAt(const intmax_t& rIndex, const int32_t val32);
    intmax_t readFrom(const intmax_t& rIndex, uint32_t& rVal32);
    intmax_t readFrom(const intmax_t& rIndex, int32_t& rVal32);
    intmax_t writeAt(const intmax_t& rIndex, const uint16_t val16);
    intmax_t writeAt(const intmax_t& rIndex, const int16_t val16);
    intmax_t readFrom(const intmax_t& rIndex, uint16_t& rVal16);
    intmax_t readFrom(const intmax_t& rIndex, int16_t& rVal16);
    intmax_t read(uint32_t& rVal32);
    intmax_t read(int32_t& rVal32);
    intmax_t read(uint16_t& rVal16);
    intmax_t read(int16_t& rVal16);
protected:
    // Actual memory storage.
    std::unique_ptr<char[]> mBuffer;
    // Buffer length
    intmax_t mBufferLength;
    // Represents the largest byte offset referenced.
    // Can be used to retrieve written length of buffer.
    intmax_t mHighWaterMark;
    // If set, caller wanted to pack data in network-byte-order.
    bool mPackNBO;
    // Set on construction, determines whether value needs to be byte-swapped.
    bool mSwapNeeded;
    // Used for file compatibility
    intmax_t mPosition;
};

我认为这将是使用模板函数进行转换的理想选择,因为这些函数非常相似,并且每种方法中都有很多重复的代码。方法之间的差异主要是16位或32位值参数的符号和大小。

无论如何,为了整合readFrom方法,我将以下方法放在一起。对于写方法,我也做了类似的事情。这些在编译实时示例中显示

/**
 * Read value (signed or unsigned) from buffer at given byte offset.
 *
 * @param rIndex [in]
 * @param rVal   [out]
 *
 * @return BytesRead or -1 on error
 */
template <typename T>
inline intmax_t readFrom(const intmax_t& rIndex, T& rVal)
{
    if ((rIndex + static_cast<intmax_t>(sizeof(T))) <= mBufferLength) {
        T* pVal = (T *)&mBuffer[rIndex];
        rVal = *pVal;
        // @JC Partial Template Specialization for 16 bit entities?
        if (sizeof(rVal) > sizeof(int16_t)) {
            SWAP32(rVal);
        } else {
            SWAP16(rVal);
        }
        mPosition = rIndex + sizeof(T);
        return sizeof(rVal);
    }
    return -1;
}

从我的评论可以看出,我仍然需要知道'T&rVal'参数的大小,以便决定对参数执行SWAP32还是SWAP16。这就是为什么我认为type_traits可能有用,而不是必须进行运行时检查以比较参数大小的原因。

我认为我走在正确的道路上,但是我无法弄清楚如何使用type_traits根据参数类型进行检查和执行某些操作。我以为可以替代地使用模板方法专业化来对16位参数进行特殊处理,但是我认为这不会节省太多精力,因为我还必须专门研究16位参数类型的两个有符号和无符号变体(假设非专业版本适用于32位值参数)。任何帮助弄清楚这一点将不胜感激。

贾罗德42

您可以使用类似:

template<typename T, std::size_t N = sizeof(T)> struct Swap;

template<typename T> struct Swap<T, 1> {
    void operator() (T&) const { /* Do nothing*/ }
};

template<typename T> struct Swap<T, 2> {
    void operator() (T& val) const { SWAP16(val); }
};

template<typename T> struct Swap<T, 4> {
    void operator() (T& val) const { SWAP32(val); }
};

然后调用它:

Swap<T>()(rVal);

因此,在上下文中:

if (sizeof(T) > sizeof(int16_t)) {
    SWAP32(val);
} else {
    SWAP16(val);
}

可以写成

Swap<T>()(val);

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

如何使用type_traits或模板功能专门化来巩固模板方法

来自分类Dev

如何使用运算符来专门化模板?

来自分类Dev

如何使用模板模板参数专门化类模板?

来自分类Dev

如何使用type_traits生成代码,具体取决于是否存在类专门化?

来自分类Dev

如何使用模板临时参数专门化模板

来自分类Dev

根据方法来专门化模板

来自分类Dev

boost :: static_visitor无法使用多种可能的类型来专门化功能模板

来自分类Dev

使用decltype尾随返回类型来专门化功能模板

来自分类Dev

明确专门化功能模板的正确方法

来自分类Dev

如何测试是否存在模板功能专门化

来自分类Dev

C ++:数组的功能模板专门化

来自分类Dev

如何使用本身就是模板的类型来专门化模板方法,其中仅返回类型依赖于模板类型?

来自分类Dev

如何使用 no-typename 参数专门化模板?

来自分类Dev

如何专门化模板子类?

来自分类Dev

如何专门化模板成员函数?

来自分类Dev

使用指令专门化的模板

来自分类Dev

使用类模板的内部类模板专门化模板

来自分类Dev

模板指向功能的部分模板专门化

来自分类Dev

最好的方法来专门化具有常规模板功能的std :: ostream和std :: vector的operator <<?

来自分类Dev

使用取决于模板参数的函数指针来专门化模板

来自分类Dev

您如何专门化非模板化类中没有参数的模板化方法?

来自分类Dev

非模板类方法的条件模板专门化

来自分类Dev

使用模板模板参数专门化基类

来自分类Dev

根据是否存在特定成员来专门化模板

来自分类Dev

根据枚举成员的值来专门化模板

来自分类Dev

您如何专门化非模板类中没有参数的模板方法?

来自分类Dev

如何部分专门化非模板类的模板成员方法?

来自分类Dev

名称空间中的功能模板专门化

来自分类Dev

无法在线程中专门化功能模板

Related 相关文章

  1. 1

    如何使用type_traits或模板功能专门化来巩固模板方法

  2. 2

    如何使用运算符来专门化模板?

  3. 3

    如何使用模板模板参数专门化类模板?

  4. 4

    如何使用type_traits生成代码,具体取决于是否存在类专门化?

  5. 5

    如何使用模板临时参数专门化模板

  6. 6

    根据方法来专门化模板

  7. 7

    boost :: static_visitor无法使用多种可能的类型来专门化功能模板

  8. 8

    使用decltype尾随返回类型来专门化功能模板

  9. 9

    明确专门化功能模板的正确方法

  10. 10

    如何测试是否存在模板功能专门化

  11. 11

    C ++:数组的功能模板专门化

  12. 12

    如何使用本身就是模板的类型来专门化模板方法,其中仅返回类型依赖于模板类型?

  13. 13

    如何使用 no-typename 参数专门化模板?

  14. 14

    如何专门化模板子类?

  15. 15

    如何专门化模板成员函数?

  16. 16

    使用指令专门化的模板

  17. 17

    使用类模板的内部类模板专门化模板

  18. 18

    模板指向功能的部分模板专门化

  19. 19

    最好的方法来专门化具有常规模板功能的std :: ostream和std :: vector的operator <<?

  20. 20

    使用取决于模板参数的函数指针来专门化模板

  21. 21

    您如何专门化非模板化类中没有参数的模板化方法?

  22. 22

    非模板类方法的条件模板专门化

  23. 23

    使用模板模板参数专门化基类

  24. 24

    根据是否存在特定成员来专门化模板

  25. 25

    根据枚举成员的值来专门化模板

  26. 26

    您如何专门化非模板类中没有参数的模板方法?

  27. 27

    如何部分专门化非模板类的模板成员方法?

  28. 28

    名称空间中的功能模板专门化

  29. 29

    无法在线程中专门化功能模板

热门标签

归档