Я пишу класс, где мне бы хотелось иметь некоторые методы-члены, которые имеют некоторые данные, связанные с ними, в частности, какие механические системы робота, которым они требуют использования. Я думал, что я мог бы написать их как функторов, что-то вроде этого (это не мой фактический код):Личные члены-функторы для класса C++
class MyRobot : public Robot {
public:
MyRobot();
void runRobot();
private:
Command do_something_,
do_another_thing_;
}
А затем инициализировать do_something_
с лямбда в конструкторе, как:
do_something_([] {
do_first_thing();
do_second_thing();
});
А потом сказать do_something_
, какие требования он имеет:
do_something_.requires(system_a);
do_something_.requires(system_b);
И в runRobot()
я бы сказал планировщик робота для выполнения команд:
void MyRobot::runRobot() {
scheduler.add(do_something_);
scheduler.add(do_another_thing_);
}
Но я пришел к выводу, что, поскольку число команд растет, тем менее управляемый конструктор MyRobot
будет, так как каждая команда будет ее тело определена там. Я могу сделать соответствующий частный метод для каждой команды и инициализировать их указателем на функцию вместо лямбда, но это просто кажется более запутанным. Я мог бы также подкласса Command
для каждой конкретной команды и, таким образом, иметь тело и требования в отдельном файле для каждого из них, но это выглядит как много накладных расходов для довольно простой задачи. Есть ли хороший способ сделать это, о котором я не знаю?
Почему бы не иметь их как простые функции-члены, и связать нужные им данные в точке, где вы передаете их в планировщик (либо через 'станд :: bind' или просто простой лямбда)? – Xeo
Несвязанные: не используйте имя «функторы» для объектов функций C++. Я знаю, что он используется многими людьми; Я прошу всех избегать этого. Это неправильное название. Слово имеет хорошо установленное значение в CS и математике, и каждый будет лучше, если мы не будем его использовать для чего-то совершенно не связанного. –
@ н.м. Я знаю, какие функторы находятся в контексте теории категорий, но учитывая, что «функтор» является наиболее часто используемым термином в контексте C++, я буду продолжать его использовать. –