【发布时间】:2018-08-21 23:13:39
【问题描述】:
我有一个从流中读取 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)
{
...
}
但这会导致对重载函数的模糊调用。
【问题讨论】:
-
照原样,您得到了同一个函数模板的两个冲突声明:去掉第一个(如果您真的想保留它,则将其限制为相反的条件)。
-
@DietmarKühl,是的,你是对的!
-
该代码存在许多潜在问题。在许多情况下,行为是未定义的或不可移植的,并且表示也可能因编译器选项而异。 最好使用 JSON 之类的文本格式,因为它更易于维护,并且更易于调试和手动修复损坏的数据。如果数据大小很重要,您可以像 DOCX 等现代 Office 文件格式一样压缩数据。
-
当你传递
vector<int>时,模板参数替换后,两个函数都在重载解析集中,因为它们“几乎”相同,这会导致歧义。 -
@Phil1970 我在设备上本地读写文件,所以我可以使用vector
::data()。
标签: c++