std :: vector的模板迭代器

时间:2017-11-14 20:15:44

标签: c++ c++11 templates vector

我正在创建一个实用程序函数,将字节数组合成一个基于模板类型的值。

我目前有两个重载函数,它们接受一对前向迭代器和一对反向迭代器,以便处理大端和小端。

是否可以使用模板化矢量迭代器并将我的两个函数合并为一个?

例如,这就是我想要做的事情:

template <typename T, typename Iter>
inline T combine_bytes(std::vector<unsigned char>::Iter const &start,
                       std::vector<unsigned char>::Iter const &end,
                       bool bigendian)
{
    T ret;
    std::copy(start, end, reinterpret_cast<unsigned char *>(&ret));

    return ret;
}

我得到的编译错误是:

Failed to specialize function template 'T Utils::combine_bytes(const Iter &, const Iter &)'

2 个答案:

答案 0 :(得分:3)

您可以使用getTime(): Date { const date = new Date(); date.setHours(this.hour); date.setMinutes(this.minute); date.setSeconds(0); date.setMilliseconds(0); return date; } 来确保迭代器引用的类型为static_assert。然后,您不必担心迭代的容器类型:

unsigned char

如果您正在使用它,您可能需要添加一些运行时检查以确保template <typename T, typename Iter> inline T combine_bytes(Iter start, Iter end) { static_assert(std::is_same<std::decay_t<decltype(*start)>, unsigned char>::value, "Must use unsigned char"); T ret; std::copy(start, end, reinterpret_cast<unsigned char *>(&ret)); return ret; } 如果您没有将其保留以保持示例简短。

答案 1 :(得分:2)

我想,使用SFINAE,你可以写下如下内容

template <typename T, typename Iter>
inline typename std::enable_if<
      std::is_same<Iter, std::vector<unsigned char>::iterator>{}
   || std::is_same<Iter, std::vector<unsigned char>::reverse_iterator>{},
   T >::type combine_bytes (Iter const & start,
                            Iter const & end,
                            bool bigendian)
{
    T ret;
    std::copy(start, end, reinterpret_cast<unsigned char *>(&ret));

    return ret;
}

即:定义通用模板类型Iter的函数,并仅在Iterstd::vector<unsigned char>::iteratorstd::vector<unsigned char>::reverse_iterator

时启用它