Как в std::map поместить указатели на функции класса? Допустим у меня есть классclass Foo { public: static Foo *fromFoo(); static Foo *fromBar(); }; Как создать такой ассоциативный массив, который будет содержать указатели на функции, чтобы я мог динамически создавать объекты из строки, без лапши вида if(str == "foo") {} ....
Вы можете использовать std::map со строковыми ключами и указателями на функции класса в качестве значений. Вот пример кода, который показывает, как это можно сделать:
#include <iostream> #include <map> #include <string> class Foo { public: static Foo* fromFoo() { return new Foo(); } static Foo* fromBar() { return new Foo(); } }; typedef Foo*(*FooCreateFunction)(); int main() { std::map<std::string, FooCreateFunction> createFunctions; createFunctions["foo"] = &Foo::fromFoo; createFunctions["bar"] = &Foo::fromBar; std::string input; std::cout << "Enter type (foo or bar): "; std::cin >> input; if (createFunctions.find(input) != createFunctions.end()) { Foo* newFoo = createFunctions[input](); std::cout << "Created new Foo object" << std::endl; } else { std::cout << "Invalid type entered" << std::endl; } return 0; }
В этом примере создается ассоциативный массив createFunctions, где ключом является строка и значением - указатель на функцию создания объекта класса Foo. Затем пользователь вводит строку для выбора типа объекта Foo, и программа использует ключ для доступа к нужной функции создания объекта.
Пожалуйста, убедитесь, что вы освобождаете память, занимаемую объектами Foo, созданными с помощью этих функций.
Вы можете использовать std::map со строковыми ключами и указателями на функции класса в качестве значений. Вот пример кода, который показывает, как это можно сделать:
#include <iostream>#include <map>
#include <string>
class Foo
{
public:
static Foo* fromFoo() {
return new Foo();
}
static Foo* fromBar() {
return new Foo();
}
};
typedef Foo*(*FooCreateFunction)();
int main() {
std::map<std::string, FooCreateFunction> createFunctions;
createFunctions["foo"] = &Foo::fromFoo;
createFunctions["bar"] = &Foo::fromBar;
std::string input;
std::cout << "Enter type (foo or bar): ";
std::cin >> input;
if (createFunctions.find(input) != createFunctions.end()) {
Foo* newFoo = createFunctions[input]();
std::cout << "Created new Foo object" << std::endl;
} else {
std::cout << "Invalid type entered" << std::endl;
}
return 0;
}
В этом примере создается ассоциативный массив createFunctions, где ключом является строка и значением - указатель на функцию создания объекта класса Foo. Затем пользователь вводит строку для выбора типа объекта Foo, и программа использует ключ для доступа к нужной функции создания объекта.
Пожалуйста, убедитесь, что вы освобождаете память, занимаемую объектами Foo, созданными с помощью этих функций.