すでにここで同様の質問をしましたが、質問の定式化が不十分で例が悪かったため、希望する答えが得られませんでした。だから私はそれに別のショットを与えます、うまくいけばより良い説明とより良いコードで。
以下のコードは不要な詳細が削除されていますが、機能します。可能であれば、テンプレート化された関数呼び出しを単純化するために、テンプレート引数の推定を使用したいと思います。
コマンドを作成するファクトリがあります。コマンドを作成するには、次のような呼び出しを使用します。
mCommandFactory.createCommand<
DoSomeStuff,
ParameterType1,
ParameterType2,
ParameterType3,
ParameterType4
>
(std:string("some description"),
parameter1,
parameter2,
parameter3,
parameter4);
ご想像のとおり、parameter1のタイプは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の呼び出し)をできるだけ単純かつ短く保つことです。
何か案は ?