Есть несколько способов сделать это, самый простой, вы можете использовать std::function
.В этом примере мы возвращаем лямбда-функцию для каждого случая.Вы можете заменить его функциями, которые вы только что написали.
class Handler {
public:
std::function<void()> handleMessage(int code) {
code = code + 1; // ++code or whatever
if (code == X) {
return []() { std::cout << "Cool! I'am x!" << std::endl; };
} else if (code == Y) {
return []() { std::cout << "Cool! I'am x!" << std::endl; };
} else if (...) {
...
} else {
....
}
}
};
Тогда ваша основная функция становится:
int main (int argc, char *argv[]) {
Handler handle;
const auto func = handle.handleMessage(0);
func();
return 0;
}
Вы можете заменить оператор swith / if на массив, хранящий различные функции, как они упоминались в комментариях.
Если вы не хотите оплачивать дополнительный вызов виртуальной функции в отношении использования std::function
, вы можете использовать псевдоним, такой как ответ ниже, или просто ключевое слово auto:
class Handler {
public:
constexpr auto handleMessage(int code) {
code = code + 1; // ++code or whatever
if (code == X) {
return &func1;
} else if (code == Y) {
return &func2;
} else if (...) {
...
} else {
....
}
}
};