首页 > 解决方案 > 用于读取 std::vector 的模板函数来自流

问题描述

我有一个从流中读取 std::vector 的模板 ReadVector 函数:

    template <class Stream, typename T>
    inline void ReadVector(Stream & s, std::vector<T> & items)
    {
        s.Read(reinterpret_cast<uint8_t *>(items.data()), items.size() * sizeof(T));
    }

具有布尔向量的专业化:

    template <class Stream>
    void ReadVector(Stream & s, std::vector<bool> & x)
    {
    ...
    }

上面的代码可以编译,但我想只在 T 是算术类型时才调用第一个函数,所以条件应该是这样的:

std::enable_if<std::is_arithmetic<T>::value && !std::is_same(T, bool)::value

但我无法弄清楚语法是什么。

如果 T 不是 bool 并且不是算术,我还想对 ReadVector 进行另一种专业化。

我的第一个想法是这样的:

    template <class Stream, typename T>
    void ReadVector(Stream & s, std::vector<T> & items);

    template <class Stream, typename T>
    typename std::enable_if<std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type ReadVector(Stream & s, std::vector<T> & items)
    {
    ...
    }

但这会导致对重载函数的模糊调用。

标签: c++

解决方案


想通了!

    template <class Stream, typename T>
    typename std::enable_if<std::is_arithmetic<T>::value && !std::is_same<T, bool>::value, void>::type ReadVector(Stream & s, std::vector<T> & v)
    {
        s.Read(reinterpret_cast<uint8_t *>(v.data()), v.size() * sizeof(T));
    }

    template <class Stream, typename T>
    typename std::enable_if<std::is_class<T>::value, void>::type ReadVector(Stream & s, std::vector<T> & v)
    {
        for (auto & elem : v)
        {
            Read(s, elem);
        }
    }

    template <class Stream>
    void ReadVector(Stream & s, std::vector<bool> & x)
    {
    ...
    }

推荐阅读