我有一个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
s read 函数将重载该BinaryMemoryReader
特定类型的s read 函数。
它可以让我写出更简洁的代码。
编辑:一般的想法是这样的:
BinaryMemoryReader
班。bmr->read<int>(&intVar);
bmr->read<customType>(&customTypeVar);
这样,特定的读取函数将与它们自己的类相关联,但可以从BinaryMemoryReader
.
正如我在评论中所写,我将使用以下方法:
有一个模板化的免费功能
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
所有职业专长。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句