私はC++のメッセージングシステムを開発中です。私が持っています;汎用メッセージング
class MessageData
{
public:
typedef std::vector<std::shared_ptr<MessageData>> MessageList;
virtual int getValue(std::shared_ptr<int>) { throw "Not implemented!"; };
virtual float getValue(std::shared_ptr<float>) { throw "Not implemented!"; };
virtual std::string getValue(std::shared_ptr<std::string>) { throw "Not implemented!"; };
...
...
virtual ~MessageData() {};
};
template <typename T>
class Message : public MessageData
{
T val;
public:
static std::shared_ptr<Message<T>> Make(T val) { return std::make_shared<Message<T>>(val); };
static T Get(std::shared_ptr<MessageData> in) { return in->getValue(std::make_shared<T>()); };
Message(T i) { val = i; };
T getValue(std::shared_ptr<T> out) override { return *out = val; }
~Message() {};
};
これらを使用して、私はさまざまな長さのジェネリックメッセージを便利に送受信することができます。
sendMessage(MessageData::MessageList{
Message<std::string>::Make("paint"),
Message<int>::Make(14),
Message<float>::Make(129.3f),
...
});
次に値を取得します。
sendMessage(MessageData::MessageList data) {
auto a = Message<std::string>::Get(data[0]);
auto b = Message<int>::Get(data[1]);
auto c = Message<float>::Get(data[2]);
...
}
欠点は、私がMessageDataクラスで使用する必要があるすべてのタイプをリストする必要があることです。私がサポートしたいタイプを制限することができるので、これは大きな問題ではありませんが、サードパーティのライブラリを使用せずにタイプリストをテンプレート化する方法について本当に興味があります。それとも、まったく違った、より良い方法があり、同様のクリーンな構文と型の安全性を使ってメッセージを渡すことができますか?あなたのコードをより汎用的にする
ブースト::いずれかが、私は(これはしばらく時間がかかる場合があります)ブーストのコード::いずれにおいても、サードパーティのライブラリ –
ここに便利です。またはC++ 17まで待ってからstd :: anyを使用します –
外観を使用し、それを再実装したくない – Hayt