我正在创建一个实用程序函数,将字节数组合成一个基于模板类型的值。
我目前有两个重载函数,它们接受一对前向迭代器和一对反向迭代器,以便处理大端和小端。
是否可以使用模板化矢量迭代器并将我的两个函数合并为一个?
例如,这就是我想要做的事情:
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 &)'
答案 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
的函数,并仅在Iter
为std::vector<unsigned char>::iterator
或std::vector<unsigned char>::reverse_iterator