作为我的消息库的一部分,我使用这样的结构来发送消息(struct)
tMsgVolumeChanged oMsg;
[...]
oMsg.vSend<tMsgVolumeChanged>();使用基类( tMsgVolumeChanged和所有其他消息派生自该基类)中定义的vSend()方法作为
struct tMsgBase
{
tMsgBase() {}
virtual ~tMsgBase() {}
template <class T> void vSend() {
poGetMessageDispatcher()->boDispatch<T>( *static_cast<T *>(this) );
}
}
struct tMsgVolumeChanged : tMsgBase
{
}我希望vSend语句可以简化为
tMsgVolumeChanged oMsg;
[...]
oMsg.vSend();使用编译器自动推导模板的类型参数,但这不会编译(“无法推导模板参数T")。
有没有一个巧妙的“诀窍”可以用来做到这一点?或者我只是犯了一个基本的错误?
发布于 2021-08-19 11:14:46
如果你想以多态的方式使用tMsgBase,你将不得不在派生类中有一些开销。
struct tMsgBase
{
tMsgBase() {}
virtual ~tMsgBase() {}
virtual void send() = 0;
protected:
template <class T> void vSend(T * self) {
poGetMessageDispatcher()->boDispatch<T>( *self );
}
}
struct tMsgVolumeChanged : tMsgBase
{
void send() override { vSend(this); }
}对于宏来说,这无疑是一个合适的位置
#define MSG_BASE_SEND_IMPL void send() override { vSend(this); }
struct tMsgVolumeChanged : tMsgBase
{
MSG_BASE_SEND_IMPL
}否则,您可以使用CRTP
template <class T>
struct tMsgBase
{
tMsgBase() {}
virtual ~tMsgBase() {}
void vSend() {
poGetMessageDispatcher()->boDispatch<T>( *static_cast<T *>(this) );
}
}
struct tMsgVolumeChanged : tMsgBase<tMsgVolumeChanged>
{
}https://stackoverflow.com/questions/68846362
复制相似问题