これを考慮してください-おそらく不十分に書かれた-例:
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」クラスは、undo、redo、progress reportなどの実装など、すべてのコマンドに共通する多くのことを実行しますが、読みやすくするためにコードから削除しました。
今私の質問は簡単です:この呼び出しを置き換えることができるように、コマンドクラスを書き直す方法はありますか?
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
...
等々 ?(これが実際に機能するかどうかさえわかりません)
または、これを行うための別のよりエレガントな方法はありますか?ここで言及されている構文は、そこで使用されていますか?(関数f;)
私はロキのタイプリストを見てきました、そして彼らは仕事をしているようです。しかし、私はブーストでそれを見つけることができません。私はboost::mplがタイプリストを実装するために使用したいものであるとウェブ上で読みました、しかし私はMPLドキュメントによって少し混乱していますか?
これに関する洞察はありますか?よろしく、D。