С перегрузками операторов C ++ можно создать класс, который эмулирует тип указателя, поэтому я экспериментировал с абстрагированием FILE
операций чтения с этим подходом.
class FilePointer
{
FILE* file;
size_t position;
FilePointer (FILE* file, size_t position)
{
this->file = file;
this->position = position;
};
public:
FilePointer (FILE* file)
{
this->file = file;
this->position = 0;
};
FilePointer operator+ (size_t offset)
{
return FilePointer(file,position + offset);
};
FilePointer operator++ () // Prefix : ++FilePointer
{
position++;
return *this;
};
FilePointer operator++ (int) // Postfix : FilePointer++
{
FilePointer before = *this;
position++;
return before;
};
FilePointer operator+= (size_t offset)
{
position += offset;
return *this;
};
uint8_t operator* ()
{
fseek(file,position,SEEK_SET);
Uint8 out;
fread(&out,1,1,file);
return out;
};
uint8_t operator[] (size_t offset)
{
return *(*this + offset);
};
};
Как видно из приведенного выше фрагмента кода, мне удалось выяснить, как различать вариации оператора приращения, чтобы данные FilePointer f;
f++
и ++f
вели себя интуитивно.
Что если я захочу использовать этот класс для файла пишет ? В настоящее время я могу получить байт uint8_t something = f[0];
, и это работает, но если я хочу что-то «установить», то есть f[0] = 100;
, перегрузки, как они есть, не будут работать для этого.
Помимо того, является ли это "хорошей практикой" (хотя и не стесняйтесь об этом думать), есть ли способ реализовать это поведение в перегрузках операторов для класса?
uint8_t n = f[0];
n++;
f[0] = n;
Или, если подумать, что-то вроде этого:
f[1]++;
Один способ, которым я представляю, что это могло бы быть сделано, это реализовать еще один класс, который представляет «разыменованный FilePointer», но было любопытно, если это возможно сделать только с перегрузками в самом классе FilePointer.