Можно ли в С++ стрингу преобразовать в тип? Есть родительский класс функцияclass function
{
public:
function (const string &Name) name(Name) {}
virtual double get_out (const double x) const =0;
string name;
};
И есть куча классов которые наследуют этот класс переопределяя метод get_out
например: class sinus : public function
{
sinus () : function("sinus")
double get_out (const double x) { return sin(x);}
}
Далее мне нужно в зависимости от названия функции создать функцию
У каждой функции имя совпадает с название класса.function * get_function (const string name)
{
if (name == "sinus")
retrun new sinus();
}
Есть ли способ как то избежать огромного стека ifфов ? Чтобы не создавать под каждую функцию свой if, а преобразовать строку "sinus" в тип sinus?

21 Авг 2019 в 06:58
171 +1
0
Ответы
1

Да, в C++ можно использовать механизм создания объектов через фабрику объектов (Factory pattern) для достижения такой цели. В данном случае можно создать фабрику, которая будет создавать объекты исходного класса по имени.

Примерно так будет выглядеть код:

#include <iostream>
#include <string>
#include <map>
using namespace std;
class function
{
public:
function(const string &Name) : name(Name) {}
virtual double get_out(const double x) const = 0;
string name;
};
class sinus : public function
{
public:
sinus() : function("sinus") {}
double get_out(const double x) const { return sin(x); }
};
class function_factory
{
public:
typedef function* (*CreateFunction)();
static function* create_function(const string& name)
{
if (function_map.find(name) != function_map.end())
{
return function_map[name]();
}
return nullptr;
}
static void register_function(const string& name, CreateFunction createFunction)
{
function_map[name] = createFunction;
}
private:
static map<string, CreateFunction> function_map;
};
map<string, function_factory::CreateFunction> function_factory::function_map;
void register_functions()
{
function_factory::register_function("sinus", []() { return new sinus(); });
}
int main()
{
register_functions();
string function_name = "sinus";
function* func = function_factory::create_function(function_name);
if (func)
{
cout << "Function name: " << func->name << endl;
cout << "Result: " << func->get_out(3.14) << endl;
}
else
{
cout << "Function not found" << endl;
}
return 0;
}

В данном примере создается фабрика function_factory, которая позволяет регистрировать функции по имени и создавать объекты функций по этому имени. Функции регистрируются с помощью лямбда-функции, которая возвращает указатель на созданный объект.

Таким образом, можно избежать огромного количества if и использовать фабрику объектов для создания объектов по имени.

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 92 648 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир