我正在阅读RapidJSON的代码,我不明白这段代码:
//! Reserve n characters for writing to a stream.
template<typename Stream>
inline void PutReserve(Stream& stream, size_t count) {
(void)stream;
(void)count;
}
//! Put N copies of a character to a stream.
template<typename Stream, typename Ch>
inline void PutN(Stream& stream, Ch c, size_t n) {
PutReserve(stream, n);// I think this function does nothing
for (size_t i = 0; i < n; i++)
PutUnsafe(stream, c);
}
Run Code Online (Sandbox Code Playgroud)
任何人都可以为我解释'PutReserve'的目的吗?
此代码允许其他人专门PutReserve针对他们自己的流类型.这使得其他形式的流可以选择对这里传递的信息采取行动 - 在这种情况下,count字符即将插入到流中.
你是正确的,存储库现在没有这样的专业化,因此单独从这个代码就不会发生任何事情.但是,如果这是作为用户扩展的选项(或库中的未来扩展),它仍然有目的.如果它仍然是非专业化的,编译器当然会看到该函数什么也不做,并完全优化它.
在实践中,想要将此库与其MyStream类型一起使用的用户将专门化这样的函数:
template<> void PutReserve(MyStream& stream, size_t count) {
// ...user code
}
Run Code Online (Sandbox Code Playgroud)
但请注意,C++标准库将namespace std在未来的C++版本中消除所有形式的函数模板特化(in ),将functor类替换为"自定义点".请参阅此问题的基本原理.