我已經問過a similar question here,但是我沒有真正得到我想要的答案,因爲我的問題制定得不好,而且例子很糟糕。所以我再給它一次,希望有更好的解釋和更好的代碼。混合命令模式,工廠模式和模板都在一起...
代碼波紋管已被剝離出不必要的細節,但它的工作原理。 事情是我想使用模板參數扣除,如果可能的話,以簡化模板函數調用。
我有一個創建命令的工廠。要創建一個命令,我用這樣一個呼叫:
mCommandFactory.createCommand<
DoSomeStuff,
ParameterType1,
ParameterType2,
ParameterType3,
ParameterType4
>
(std:string("some description"),
parameter1,
parameter2,
parameter3,
parameter4);
正如你可能已經猜到了,參數1類型ParameterType1,等等......。
現在,如果我們看一下命令的定義 - DoSomeStuff-本身:
class DoSomeStuff : public UndoableCommand< ParameterType1 , ParameterType2, ParameterType3 , ParameterType4 >
{
public:
DoSomeStuff(... /* arguments which are needed for precessing the command and undoing it*/);
~DoSomeStuff() throw();
void executeImpl();
void undoImpl();
protected:
... /* members which are needed for precessing the command and undoing it*/
};
正如你所看到的,ParameterTypeN信息已經DoSomeStuff的聲明中。
我想知道是否有可能以某種方式通過更簡單的東西來代替上述createCommand電話:
mCommandFactory.createCommand<DoSomeStuff>
(std:string("some description"),
parameter1,
parameter2,
parameter3,
parameter4);
這裏是的CommandFactory代碼:
class CommandFactory
{
private:
// some stuff used to initialize objects created by this factory
public:
CommandFactory(...) : ... /* members initialization */
{
}
template <class CommandType, typename P1, typename P2, typename P3, typename P4>
void createCommand(juce::String& description,P1 p1, P2 p2, P3 p3, P4 p4)
{
Undoable* cmdPtr = new CommandType(p1, p2, p3, p4);
...
// init cmdPtr
(*cmdPtr)();
}
基本點是移動CommandFactory內部的複雜性,以保持「客戶端代碼」(對createCommand的調用)儘可能簡單和簡短。
任何想法?
我不確定...我在代碼的其餘部分使用綁定和函數,但對於動態綁定。在這裏,一切都在編譯時已知。也許我完全忽略了你的觀點。我需要一個簡單的例子來看看你會如何使用函數來解決這個特定的問題... – Dinaiz 2012-08-16 00:24:06