c++ - 用于读取 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)
{
...
}
但这会导致对重载函数的模糊调用。
解决方案
想通了!
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)
{
...
}
推荐阅读
- python - 在 Python 中查找所有唯一的替换组合
- c# - 异步方法不一致地填充 XAML 绑定字段
- r - 使用元数据标签管理文本摘录并使用 R 或 RStudio 进行挖掘?
- database - 如何正确存储和查询可用性数据
- javascript - 使用for循环拼接数组的正确方法是什么,嵌套了if条件
- swift - 应用退出后仍保留在活动监视器中
- swift - Twilio 无效的访问令牌 - Swift
- css - 修改此 CSS 掩码方法以允许用户仅输入 -9999999 到 9999999 之间的值
- docker - UWP 应用程序的 Docker 映像
- javascript - 如何检测。如果 VirtualBox 已打开,则通过 javascript