Оправданно ли использование 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, и только так заработало.
Я это сделал чисто случайно, и теперь мое решение.. Ну мне оно кажется костыльным =(
Подскажите, как лучше поступить в моем случае?
Спасибо!

21 Авг 2019 в 06:57
173 +1
0
Ответы
1

В вашем случае, если вы хотите сохранить структуру вашей программы и использовать нестатические методы в 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. Это более гибкое и чистое решение, чем использование статических методов.

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