我有一个BinaryMemoryReader
类,其函数定义如下:
template <typename T>
inline void read(T **data) {
*data = (T*)&stream[position];
position += sizeof(T);
}
它处理内存流中的大多数标准类型。
自定义复杂类型具有自己的读取功能,例如:
void AnotherClass::read(BinaryMemoryReader *const reader)
{
reader->read<bool>(&num);
reader->read<short>(&count);
}
我想写的是当我写
时会写的代码reader->read<AnotherClass>(&var);
会调用第二个函数。这意味着AnotherClass
的读取函数会使该特定类型的BinaryMemoryReader
读取函数重载。
这将允许我编写更清晰的代码。
修改 一般的想法是:
BinaryMemoryReader
课程。bmr->read<int>(&intVar);
bmr->read<customType>(&customTypeVar);
这样,特定的读取函数将与它们自己的类相关联,但是可以从BinaryMemoryReader
调用。
答案 0 :(得分:1)
正如我在评论中写的那样,我会使用以下方法:
拥有模板化自由功能
template <typename T>
void read(BinaryMemoryReader& bmr, T& data) {
bmr.read(&data);
}
为您要处理的每种类型专门化该功能
class AnotherClass {
template <typename T>
friend void read(BinaryMemoryReader& bmr, T &data);
bool num;
short count;
};
template <>
void read(BinaryMemoryReader& bmr, AnotherClass &data) {
bmr.read<bool>(&(data.datanum));
bmr.read<short>(&(data.count));
};
称之为
BinaryMemoryReader bmr;
AnotherType at;
read(bmr,at);
该技术用于例如 c ++标准I / O库和为
提供的重载 std::ostream& operator<<(std::ostream&, const T&);
std::istream& operator>>(std::istream&, T&);
功能
或者,你可以对BinaryMemoryReader::read()
函数进行专门化。但BinaryMemoryReader
必须是所有班级专业化的friend
。