あなたの説明は、 と を組み合わせた機能によく似ていstd::function
ますstd::bind
。これらを使用すると、渡す必要のあるすべての引数を格納する呼び出し可能な関数オブジェクトが作成され、特定の詳細を知らなくても呼び出しを実行できます。メンバー関数とフリー関数の両方で動作します。Command
クラスを要件を説明する単純なラッパーに変更できます。
以下の例では、フリー関数を使用してこれを行います。クラスは、引数やそのCommand
型を気にしません。気にするのは、コマンド自体がどのようにディスパッチされるかだけです。
#include <iostream>
#include <functional>
#include <string>
class Command
{
public:
Command(const std::string& name, const std::function<void()>& func)
: name_(name), func_(func) {}
Command(const Command& o) : name_(o.name_), func_(o.func_) {}
void operator()()
{
std::cout << "executing " << name_ << std::endl;
func_();
};
const std::string name() const { return name_; }
private:
Command& operator=(const Command&);
const std::string name_;
const std::function<void()> func_;
};
void start(int a, const char* b)
{
std::cout << "start(" << a << "," << b << ")" << std::endl;
}
void setResolution(int a, int b)
{
std::cout << "setResolution(" << a << "," << b << ")" << std::endl;
}
int main()
{
Command start("start", std::bind(start, 1, "hello world"));
Command setRes("setRes", std::bind(setResolution, 640, 480));
start();
setRes();
}