私はライブラリの設計に取り組んできました。 1つの側面はEventManager
になります。C++イベントハンドラクラスを設計する
これまでのデザインは次のように行く:
文字列がstd::string
で、機能が
std::function<void()>
client.on
では、そのように定義されて
Client client
client.on(string, function);
:
void Client::on(const std::string& name, const std::function<void()>& function) {
_eventManager->add(string, function);
}
そして_eventManager->add(string, function)
唯一の目的は作成することです。 Event
という名前の構造体に名前と関数を格納し、新しいストラットをベクトルにプッシュします。これは、ループがベクトル配列とは、あなたがemit
と呼ばれ、その構造体の中の関数を実行するときに使用する名前に等しい任意のevent.name
を見つけます _eventManager->emit("test");
:
今、私はこれに似た何かを行うことができます。
_eventManager->emit()
で2番目の引数を送信する必要があるため、これはすべてうまく動作し、すごく素晴らしいです。 2番目の引数は不明ですが、不明ではありませんが、最初の引数に入力した文字列に基づいて複数のデータ型にすることができます。
使用例:
Client client();
client.on("ready", [](User user) {
user.test();
});
User user;
_eventManager->emit("ready", user); //I know this does not exists but it is nearly an example.
client.on("message_created", [](Message message) {
std::cout << message << std::endl; //Operator overload here
}
Message message("Something to print");
_eventManager->emit("message_created", message));
私が渡されている許可される複数の種類を許可するようにboost::variant
を使用して考えたが、しかし、あなたはとても関数内のような何かをすることによってそれらを取得する必要があります。
client.on("ready", [](boost::variant<User, Message> args){
User user = boost::get<User>(args);
});
そして、あまりにも単純なものと仮定され、私はむしろ渡されるクラスを取得するために、すべてのイベント内boost::get
を使用するように強制ライブラリを使用している人を持っていません。
これまで述べてきたすばらしい情報があれば、私がやりたいことのもう一つの選択肢は何でしょうか?なぜ私がやっていることをやるべきか、してはならないのかについての示唆はありますか?
これは私に長い時間を費やしてくれましたので、進んでいただきありがとうございます。
が理由だけではなく、[のQt](https://www.qt.io)のような既存のライブラリを使用しないで、[SFML](https://でWWW .sfml-dev.org)、[gtk](https://www.gtk.org)またはそれに類するもの?なぜ車輪を再発明する苦痛を経験するのですか? –
'on'関数テンプレートは、コールバックが受け入れる引数の型を知っています。それは、変種を取る中間サンクをインスタンス化することができ、予想されるタイプを抽出し、成功した場合は元のコールバックを呼び出します。 – Useless