gpt4 book ai didi

c++ - void* 和 const void* for function parameter -> struct member 的解决方法

转载 作者:行者123 更新时间:2023-11-30 02:47:00 34 4
gpt4 key购买 nike

所以我正在为我的人工智能使用这个电报/消息调度系统。来自 Matt Buckland 的“Programming Game A.I. by Example”一书。

我对 MessageDispatcher 类有这个方法:

void DispatchMsg(double delay, int sender, int receiver, int msg, void *additionalInfo = nullptr);

然后使用 Telegram 结构:

struct Telegram
{
// Messages can be either dispatched immediately or delayed for
// a specified amount of time. If a delay is necessary, this
// field is stamped with the time the message should be dispatched.
double DispatchTime;

// Who is sending this message
int Sender;

// Who should the component give this message to
// may be set to -1 if not required
int Receiver;

// Message itself, should be one of the several enumerated types
int Msg;

// Additional information that might want to be passed along
void *ExtraInfo;

Telegram():DispatchTime(-1),
Sender(-1),
Receiver(-1),
Msg(-1)
{
// Empty
}

Telegram(double time,
int sender,
int receiver,
int msg,
void *info = nullptr):DispatchTime(time),
Sender(sender),
Receiver(receiver),
Msg(msg),
ExtraInfo(info)
{
// Empty
}
};

像这样的类型转换:

template <class T>
inline T DereferenceToType(void *p)
{
return *(T*)(p);
}

问题就在这里:

void Player::playerFeed() {
if (!Target)
return;
Courier->DispatchMsg(SEND_MSG_IMMEDIATELY, PLAYER_ID, TargetedActor, MessageType::PLAYER_FED, &ActorNode->getPosition());
}

其中 ActorNode->getPosition() 来自 Ogre3d Ogre::SceneNode:

virtual const Vector3 &     getPosition (void) const

获取节点相对于其父节点的位置。

然后我把它拿回来做:

Ogre::Vector3 attackerPos = DereferenceToType<Ogre::Vector3>(msg.ExtraInfo);

我更愿意在这里使用 const Ogre::Vector3,这可以通过编写一个 const 解引用辅助函数来完成。

无论如何,问题是:xxx|90|警告:从“const void*”到“void*”的无效转换 [-fpermissive]|

我理解警告;但我不确定如何解决这个问题。

我尝试通过为 DispatchMsg 编写第二种方法来修复它:

void DispatchMsg(double delay, int sender, int receiver, int msg, void *additionalInfo = nullptr);
// For const void*
void DispatchMsg(double delay, int sender, int receiver, int msg, const void *additionalInfo);

但这在创建 Telegram 时将警告移到了函数中。所以我尝试了一些事情,比如在我的 Telegram 结构中创建第二个参数,称为 const void *ConstExtraInfo,问题是这似乎使 Telegram 结构变得困惑。

基本上我的问题是:是否有一种干净的实现方式,或者是否必须通过在 Telegram 中让额外的成员找出存储的信息类型来完成?

是否可以使用 void* 或 const void* 的模板来完成,例如:电报,或者这会使电报的接收端复杂化吗?

如果我需要发布更多相关信息,请告诉我。谢谢。

最佳答案

您的第一个问题是 additionalInfo 指针应该是 const 限定的。
然后,您的模板也应该使用 const
最后,它应该返回一个引用而不是复制数据:

template <class T> inline const T& DereferenceToType(const void *p)
{
return *(const T*)p;
}

无论如何,为什么要隐藏 Actor 阵容?相反,在收件人中这样做:

const auto& extra = *(T*)p;

关于c++ - void* 和 const void* for function parameter -> struct member 的解决方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23050773/

34 4 0