Можно ли в С++ стрингу преобразовать в тип? Есть родительский класс функция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
198 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир