Динамически типизированный доступ к файлам через шаблоны или чисто виртуальное наследование базового класса? - PullRequest
0 голосов
/ 07 марта 2012

Я хотел бы получить доступ к файлу , который содержит пары ключ-> значение различных типов (в настоящее время только double, но может быть, например, long double в будущем). Доступ к файлу может происходить между ключами, после чего будет сделана некоторая (довольно сложная) интерполяция. Скорость доступа очень важна.

Я вижу две возможности для реализации этого:

  1. Используйте templates , чтобы написать универсальное средство чтения для файлов этого типа, используя ключи и типы значений в качестве параметров шаблона. Это будет очень быстро и удобно для реализации, однако, при открытии необходимо, чтобы люди знали типы файлов.
    Чтобы открыть файл, не зная точных типов, мне нужно было бы реализовать обертку , открывающую файлы различных типов и приводящую типы, что означало бы несколько приведений к каждому файлу. < br /> Недостатком является то, что эта обертка будет довольно уродливой и большой, потому что она должна включать специальный случай для каждой возможной комбинации типов . Я бы, вероятно, автоматически сгенерировал код для этой оболочки или использовал магию препроцессора.
  2. С точки зрения информатики, было бы намного лучше заключить ключ и тип значения в классы с общим абстрактным базовым классом и постоянно обрабатывать указатели на эти классы.
    Это значительно упростит использование файлов неизвестных типов, хотя все время включает динамическое приведение.
    Проблема заключается в том, что вышеупомянутая интерполяция потребует создания большого количества этих классов-оберток вместе с большим количеством вызовов виртуальных функций, что, вероятно, существенно повлияет на скорость доступа к отрицательному значению.
    Я также не решаюсь добавить такую ​​гибкость, которую никто никогда не сможет использовать (в конце концов, double - единственное, что требуется сейчас).

Что бы вы сделали? У вас есть лучшие предложения?

1 Ответ

2 голосов
/ 07 марта 2012

Посмотрите на шаблон фабричного дизайна.На фабрике вы передадите заголовок -> тип файла, и он сгенерирует читателя для этого файла.Поэтому вы должны определить интерфейс IFile и реализовать его в ваших классах PdfFile, TxtFile, DocxFile и т. Д.

Вы можете использовать абстрактную фабрику или фабричный метод в зависимости от ваших требований. Я приведу пример абстрактной фабрики:

class IFileFactory{
public:
 virtual IFile* getInstance( const std::string& fileHeader ) = 0; //header in hex representation.
};

class ConcreteFileFactory : public IFileFactory{
 IFile* getInstance( const std::string& fileHeader ){
    if( fileHeader == "33442233" )
    {
       return new PdfFile();
    }else if( fileHeader == "4455533" ){
       return new DocxFile();
    }
    //......
    throw FactoryException("Unknown file");
 }
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...