2016-05-04 4 views
0

Я пытаюсь создать класс, который будет анализировать файл на C++. Однако файл фактически находится в 2 файлах, заголовке и необработанных данных.C++ неизвестный тип переменной. Должен ли я использовать шаблон?

Заголовок содержит тип данных необработанных данных (это может быть int, double, float и т. Д.). Я хочу создать переменную в моем классе, которая будет хранить необработанные данные. Обработка будет такой же, независимо от типа данных.

Должен ли я использовать шаблон для этого? Разве это не слишком сложно использовать шаблонный шаблон только для одной переменной?

Спасибо.

+0

«Должен ли я использовать шаблон для этого? 'Какие у вас другие варианты? – sjsam

+0

Я не знаю. Возможно, просто объявите указатель на пустоту, выделите необходимую память, скопируйте необработанные данные и затем нарисуйте базу указателей на тип данных. Это не совсем чистый, но я чувствую, что использование шаблона только для одной переменной не является оптимальным. Это ? – whiteShadow

+1

'boost :: variant' - нет необходимости изобретать велосипед. –

ответ

1

Шаблоны могут определенно помочь вам здесь. Они предлагают способ уменьшить повторение той обработки, которая, как вы говорите, одинакова для всех типов.

Следует ли вам «использовать» их, это, конечно, более сложный вопрос, равно как и вопрос о том, является ли это излишним - оба являются вопросами мнений, но общее использование предполагает, что использование только одной переменной не будет фактором, который решите это.

Если содержимое файлов, содержащих разные типы, необходимо обработать в одном и том же контейнере или если файл может содержать более одного типа, возможно, более подходящим вариантом будет вариант boost.

Поскольку вы читаете типы из файла, эти типы известны во время выполнения, но поскольку список параметров известен во время компиляции, вы можете проверить тип в файле и передать его.

if(typeFromFile == headerValueForint) 
{ 
    processFile<int>(); 
} 
else if (typeFromFile == headerValueFordouble) 
{ 
    processFile<double>(); 
} 

Однако, как и всех типов вы перечисляете числовые (и я удивляюсь, как обработка действительно может быть таким же, если есть какие-либо другие не числовые типы) вы можете решить, чтобы прочитать все значения в качестве двойников - с подходящая проверка диапазона. Это может занять больше памяти, но влияние этого зависит от того, что на самом деле связано с обработкой.

+0

Дело в том, что у меня есть файл заголовка, указывающий количество измерений, размер каждого размера, тип данных и т. Д. Затем у меня есть двоичный файл (необработанные данные), который я должен читать на основе эти данные. Чтобы было проще, я хочу прочитать заголовок и создать массив (с соответствующим типом, размерами, размерами и т. Д.), Чтобы поместить в него все необработанные данные, поэтому мне нужно только один раз прочитать файл, и затем я могу получить доступ к данным в массиве. Поэтому во время компиляции я не знаю размер или тип массива, но я знаю это во время выполнения. – whiteShadow

+0

ОК, с учетом типа, вот что показывает мой пример кода. Проверка времени выполнения, которая вызовет шаблонный код с правильным типом. Фактический вызов, вероятно, будет отличаться от моего примера, поскольку он, скорее всего, примет некоторые параметры. С точки зрения размера коллекции, которую можно легко установить во время выполнения. – ROX

+0

О, ладно, я неверно истолковал то, что вы предложили. Это был действительно мой первоначальный план, но я не был уверен, что создание нового шаблонного класса для одной шаблонной переменной было хорошей идеей. Благодаря :) – whiteShadow

2

Что касается использования функции перегрузки? Вы сказали, что обработка такая же, так что ... Думаю, вы могли бы. Я иногда использую их, чтобы делать подобные вещи.

Пример:

header.h

class MyClass { 
public: 
    void function(int x); 
    void function(double x); 
    void function(string x); 
    void function(char x); 
}; 

компилятор будет знать, какие функции использовать, в зависимости от значения, которое вы отправляете (прохождение) к нему.

+0

Разве это не проблема, если вам нужно вызвать некоторые подфункции? Вам, вероятно, тоже придется перегружать их, верно? Скажем, мне нужно получить доступ к моим данным по координатам (get (x, y, z)), тогда мне нужно будет создать функцию для каждого типа данных (так как тип return может быть другим). Я начинаю думать, что шаблонный класс на самом деле будет проще. Благодарю. – whiteShadow

+0

Учитывая, что обработка будет такой же, функция перегруженной функции приведет к большому количеству (близкому) повторению - каждый будет отличаться только там, где появляется тип параметра x. Это именно то, где вам помогут шаблоны - заменив этот бит кода типа «любой тип ввода» параметром шаблона и позволяя всем версиям реализовывать один и тот же исходный код. – ROX

+0

Проблема в том, что я должен хранить эти данные. Я читаю большой текстовый файл, и для повышения эффективности я хочу сначала сохранить эти данные в переменной, а затем обработать ее. Я пока не знаю, какая обработка будет. Чтобы быть более конкретным, я создаю программу, которая анализирует некоторые файлы, которые могут иметь разные размеры данных, тип данных и т. Д. Скажем, например, я хочу, чтобы средние значения в данном регионе, я думаю, это проще иметь шаблонный массив, содержащий значения, и шаблонную функцию усреднения, а не перегружать все. – whiteShadow

 Смежные вопросы

  • Нет связанных вопросов^_^