Итак, я обнаружил радости стратегий.
class Strategy
{
public:
virtual void action() = 0;
};
class FooStrategy : public Strategy
{
virtual void action() { /* do some stuff */ };
};
class BarStrategy : public Strategy
{
virtual void action() { /* do different stuff */ };
};
void computation()
{
Strategy *strategy;
if ( /* some decision logic */ )
strategy = new FooStrategy();
else
strategy = new BarStrategy();
//later on...
//big loop! don't want any overheads beyond what if/else would give
for (int i=0;i<100000000;++i)
{
//...various other code and then:
strategy->action();
}
//...other code and possibly more strategy->action() calls, then finally:
delete strategy;
}
Все это написано для замены предложения if/else
логикой принятия решений каждый раз, когда мне нужно action()
.Мы можем предположить, что это читается более ясно, потому что именно поэтому мы используем это.Что касается накладных расходов, таблица виртуальных функций для strategy
, несомненно, попадет в кэш процессора, поэтому здесь должно быть мало накладных расходов по сравнению с if/else
, верно?
Однако.C ++ не допускает абстрактные базовые классы в стеке, предположительно, поскольку их размер неизвестен, поэтому strategy
должен жить в куче, вводя опасные операторы new
и delete
.Конечно, я мог бы написать класс-обертку, чтобы безопасно обрабатывать создание и удаление стратегий, и мы надеемся, что это будет полностью оптимизировано компилятором.Но мне интересно, есть ли более элегантный способ поместить Strategy
в стек, обеспечивая тем самым автоматическое удаление, учитывая, что все стратегии имеют одинаковый размер?
Редактировать Спасибо всем за ответы, я думаю, что они все очень хороши и просвещают в отношении различных способов ведения дел.Я собираюсь воздержаться от принятия любого человека как правильного.Я рекомендую всем будущим читателям рассмотреть их все и быть либеральным с голосами поддержки!