Можно ли в С++ стрингу преобразовать в тип? Есть родительский класс функция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?
Да, в C++ можно использовать механизм создания объектов через фабрику объектов (Factory pattern) для достижения такой цели. В данном случае можно создать фабрику, которая будет создавать объекты исходного класса по имени.
В данном примере создается фабрика function_factory, которая позволяет регистрировать функции по имени и создавать объекты функций по этому имени. Функции регистрируются с помощью лямбда-функции, которая возвращает указатель на созданный объект.
Таким образом, можно избежать огромного количества if и использовать фабрику объектов для создания объектов по имени.
Да, в 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 и использовать фабрику объектов для создания объектов по имени.