一个解决方案是多态性:两个结构都继承自一个公共基类。然而,这意味着";is-a";这种关系可能不存在,并且会使您的代码变得尴尬和难以理解。考虑到这一点,另一个解决方案(由于C++17(将是
我有两种类型的事件,它们具有相关值,例如:
struct EventRequest
{
char EventType;
int RetryCount;
} ER;
struct EventStatus
{
char EventType;
char StatusType;
short RetryCount;
} ES;
我想把上面的结构推到一个单独的队列/堆栈上,比如:
queue<typedef>q;
q.push(ER);
q.push(ES);
q.push(ER):
.
.
.
我该怎么做?
std::variant
。
#include <queue>
#include <variant>
struct EventRequest {
char EventType;
int RetryCount;
} ER;
struct EventStatus {
char EventType;
char StatusType;
short RetryCount;
} ES;
int main() {
std::queue<std::variant<EventRequest, EventStatus>> q;
q.push(ER);
q.push(ES);
return 0;
}
这个问题有几种解决方案:
使所有结构从同一个基本接口继承并使用智能指针。
使用
union
s(旧式(对于这个例子,我将展示如何使用
std::variant
#include <variant>
#include <queue>
struct EventRequest
{
char EventType;
int RetryCount;
};
struct EventStatus
{
char EventType;
char StatusType;
short RetryCount;
};
using AnyEvent = std::variant<EventRequest, EventStatus>;
int main()
{
std::queue<AnyEvent> event;
event.push(EventRequest());
event.push(EventStatus());
return 0;
}
在此处运行此代码:https://onlinegdb.com/D17aVXA1K