Пожалуйста, примите во внимание это, вероятно, плохо написанный пример:
class Command;
class Command : public boost::enable_shared_from_this<Command>
{
public :
void execute()
{
executeImpl();
// then do some stuff which is common to all commands ...
}
// Much more stuff ...
private:
virtual void executeImpl()=0;
// Much more stuff too ...
};
и:
class CmdAdd : public Command
{
public:
CmdAdd(int howMuchToAdd);
void executeImpl();
int _amountToAdd;
};
// implementation isn't really important here ....
С этим я могу просто добавить обратный вызов, используя этот синтаксис:
boost::shared_ptr<Command> cmdAdd(CmdAdd(someValue));
cmdAdd->execute();
Работает без нареканий. Мой класс «Command» делает гораздо больше вещей, которые являются общими для всех команд, таких как реализация отмены, возврата, отчета о ходе выполнения и т. Д., Но я удалил его из кода для удобства чтения.
Теперь мой вопрос прост:
Есть ли способ переписать командный класс, чтобы я мог заменить этот вызов:
boost::shared_ptr<Command> cmdAdd(CmdAdd(someValue));
cmdAdd->execute();
чем-то вроде:
CmdAdd(someValue); // preferably
or CmdAdd->execute(someValue)
Я много думал об этом, но у меня есть концептуальная проблема:
Я хотел шаблонизировать свой класс Command как
template <typename R,typename T1, typename T2, ..., typename Tn> class Command
{
R1 execute(T1 p1, ...,Tn pn)
{
return executeImpl(T1 p1, ...,Tn pn);
// then do some stuff which is common to all commands ...
}
}
но, очевидно, здесь есть проблема:
синтаксис template <typename R,typename T1, typename T2, ..., typename Tn>
не является допустимым C ++, AFAIK.
Должен ли я написать n версий Command, например:
template <typename R> class Command
template <typename R,typename T1> class Command
template <typename R,typename T1, typename T2> class Command
...
и так далее?
(даже не уверен, что это сработает)
Или есть другой, более элегантный способ сделать это?
Синтаксис, упомянутый здесь какого-либо использования там? (функция f;)
Я просматривал списки типов Локи, и они, похоже, справляются со своей задачей. Но я не могу найти ничего такого в Boost. Я читал в Интернете, что boost :: mpl - это то, что нужно использовать для реализации списков типов, но меня немного смущают документы MPL?
Есть идеи по этому поводу?
Regads,
D.