請考慮這個 - 可能須寫不好例如:擁有可變數量模板參數的最佳方式是什麼?
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)
我已經一直在想這很多,但我有一個概念問題: 我想模板我的命令類如
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個版本,如:
template <typename R> class Command
template <typename R,typename T1> class Command
template <typename R,typename T1, typename T2> class Command
...
等等? (甚至不知道這是否會工作確實)
或者是有另一種更優雅的方式來做到這一點? 是語法,提到here有什麼用處? (函數f;)
我一直在看Loki的類型列表,他們似乎做的工作。但我在Boost找不到任何東西。我在網上讀到boost :: mpl是用來實現類型列表的,但是我對MPL文檔有點困惑?
對此有何見解? Regads, D.
非常感興趣!事實上,我添加了一個非模板的CommandBase類,這正是爲了容器的目的。保存/恢復參數也可以完美地工作(取消一些技巧)。 我最後選用使用這種方法 「模板類命令 模板類命令 模板類命令 」,用升壓預處理器一起。似乎是最簡單的方式,但我仍然有一些合成問題。 我發現你的方法比我的更優雅,所以非常感謝,我會看看這個strtegy模式:-) –
Dinaiz
2010-06-28 00:37:23