Как я понимаю, цель этой проблемы - научить, как использование шаблона ограничено определением типа во время компиляции.Довольно просто, что выбор пользователя будет ограничен некоторым списком типов, которые разработчик хотел явно указать.Теперь вопрос - как это влияет на результирующую программу?
Во-первых, вы должны понимать, что пути кода для всех возможных значений аргумента шаблона будут созданы во время компиляции.Другими словами, двоичный код для setDefaultArray
, setArraySize
, fillArray
и других функций-членов, которые вы явно или неявно вызываете в своем универсальном алгоритме, будет сгенерирован для int
, double
, char
и std::string
аргументы шаблона.Вы ничего не можете сделать, чтобы оптимизировать его из исполняемого файла.
Однако вы можете решить, как наиболее эффективно хранить ваши объекты в памяти.И, очевидно, для вашей задачи вам нужен только один экземпляр simpleVector
за раз.Таким образом, вы можете подумать о блоке памяти, достаточно большом для того, чтобы сохранить инстанцирование simpleVector
, а также указать, какой из них он в данный момент содержит.В C ++ это будет звучать так:
struct SimpleVectors {
VectorTypeEnum vte;
union {
simpleVector<int> v_int;
simpleVector<double> v_double;
simpleVector<char> v_char;
simpleVector<string> v_string;
};
};
Обратите внимание, что вы можете делать это только с POD-структурами (определение в google).Подходы, основанные на наследовании, в конечном итоге сводятся к такой компоновке.
Чтобы завершить картину, нам просто нужно подключить логику обработки к этой структуре данных:
template <
typename T
>
inline void handleTask (
simpleVector <
T
>
& v
)
{
int arraySize;
v.setDefaultArray();
cout << "Number of Inputs:";
cin >> arraySize;
v.setArraySize(arraySize);
v.fillArray();
}
Преимуществоэтот подход, основанный на наследовании, заключается в том, что вы можете сделать свои функции-члены класса встроенными, и компилятор позаботится о том, чтобы их вызовы были на порядок быстрее, чем функции виртуальных членов.
И, наконец,ключевой элемент вашей main
функции будет выглядеть так:
SimpleVectors userArray;
// we don't really need to initialize userArray.vte in this sample
if (dataType == "1" || dataType == "int") {
handleTask(userArray.v_int);
} else if (dataType == "2" || dataType == "double") {
handleTask(userArray.v_double);
} else if (dataType == "3" || dataType == "char") {
handleTask(userArray.v_char);
} else if (dataType == "4" || dataType == "string") {
handleTask(userArray.v_string);
}