Оправданно ли использование static в моем случае? У меня есть некий класс. В этом классе у меня есть функционал обработки команд пользователя. Свой "bash" скажем.. И вот у меня возник вопрос. В классе у меня есть private std::map, map этот состоит из пары . Так же есть метод CommandListener, который принимает строку от пользователя. Дальше этот метод ищет по ключу совпадение со строкой пользователя и, если нашел, выполняет значение, тобишь метод. Примерный код: mapstd::map Functions = { {"SomeF1", SomeF1}, {"SomeF2", SomeF2}, {"SomeF3", SomeF3}, {"SomeF4", SomeF4}, // ... }; Обработчик:void Client::CommandListener(std::string Command) { std::map::iterator it = Functions.find(Command); if (it == Functions.end()) std::cout <second(); } Но! Проблема заключается в том, что map отказывается принимать НЕСТАТИЧЕСКИЕ методы! Т.е. SomeF1 (и остальные) мне пришлось объявить static, и только так заработало. Я это сделал чисто случайно, и теперь мое решение.. Ну мне оно кажется костыльным =( Подскажите, как лучше поступить в моем случае? Спасибо!
В вашем случае, если вы хотите сохранить структуру вашей программы и использовать нестатические методы в map, вам придется немного изменить свой подход.
Одним из способов решения проблемы может быть использование std::function вместо указателей на функции. В этом случае вы сможете хранить любые типы функций, в том числе и нестатические методы.
Таким образом, вы можете использовать нестатические методы в map, используя std::function и std::bind. Это более гибкое и чистое решение, чем использование статических методов.
В вашем случае, если вы хотите сохранить структуру вашей программы и использовать нестатические методы в map, вам придется немного изменить свой подход.
Одним из способов решения проблемы может быть использование std::function вместо указателей на функции. В этом случае вы сможете хранить любые типы функций, в том числе и нестатические методы.
Пример кода:
#include <iostream>#include <map>
#include <functional>
class Client {
public:
void SomeF1() { std::cout << "Executing SomeF1\n"; }
void SomeF2() { std::cout << "Executing SomeF2\n"; }
void SomeF3() { std::cout << "Executing SomeF3\n"; }
void SomeF4() { std::cout << "Executing SomeF4\n"; }
void CommandListener(std::string Command);
private:
std::map<std::string, std::function<void()>> Functions = {
{"SomeF1", std::bind(&Client::SomeF1, this)},
{"SomeF2", std::bind(&Client::SomeF2, this)},
{"SomeF3", std::bind(&Client::SomeF3, this)},
{"SomeF4", std::bind(&Client::SomeF4, this)},
};
};
void Client::CommandListener(std::string Command) {
std::map<std::string, std::function<void()>>::iterator it = Functions.find(Command);
if (it == Functions.end()) std::cout << "This command does not exist\n";
else it->second();
}
int main() {
Client c;
c.CommandListener("SomeF1");
c.CommandListener("UnknownCommand");
return 0;
}
Таким образом, вы можете использовать нестатические методы в map, используя std::function и std::bind. Это более гибкое и чистое решение, чем использование статических методов.