首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >C++模板类型参数的自动推导

C++模板类型参数的自动推导
EN

Stack Overflow用户
提问于 2021-08-19 10:44:11
回答 1查看 66关注 0票数 0

作为我的消息库的一部分,我使用这样的结构来发送消息(struct)

代码语言:javascript
复制
tMsgVolumeChanged oMsg;
[...]
oMsg.vSend<tMsgVolumeChanged>();

使用基类( tMsgVolumeChanged和所有其他消息派生自该基类)中定义的vSend()方法作为

代码语言:javascript
复制
struct tMsgBase
{
            tMsgBase() {}
  virtual  ~tMsgBase() {}

  template <class T> void vSend() { 
    poGetMessageDispatcher()->boDispatch<T>( *static_cast<T *>(this) );
  } 
}

struct tMsgVolumeChanged : tMsgBase
{
}

我希望vSend语句可以简化为

代码语言:javascript
复制
tMsgVolumeChanged oMsg;
[...]
oMsg.vSend();

使用编译器自动推导模板的类型参数,但这不会编译(“无法推导模板参数T")。

有没有一个巧妙的“诀窍”可以用来做到这一点?或者我只是犯了一个基本的错误?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2021-08-19 11:14:46

如果你想以多态的方式使用tMsgBase,你将不得不在派生类中有一些开销。

代码语言:javascript
复制
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); }
}

对于宏来说,这无疑是一个合适的位置

代码语言:javascript
复制
#define MSG_BASE_SEND_IMPL void send() override { vSend(this); }

struct tMsgVolumeChanged : tMsgBase
{
    MSG_BASE_SEND_IMPL
}

否则,您可以使用CRTP

代码语言:javascript
复制
template <class T>
struct tMsgBase
{
            tMsgBase() {}
  virtual  ~tMsgBase() {}
  void vSend() { 
    poGetMessageDispatcher()->boDispatch<T>( *static_cast<T *>(this) );
  } 
}

struct tMsgVolumeChanged : tMsgBase<tMsgVolumeChanged>
{
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68846362

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档