首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基类中的typeid(*this).name()和typeid(this).name()有什么区别?

基类中的typeid(*this).name()和typeid(this).name()有什么区别?
EN

Stack Overflow用户
提问于 2020-12-04 06:27:08
回答 1查看 265关注 0票数 0
代码语言:javascript
复制
class Event
{
public:
    virtual std::string getEventType()
    {
        return typeid(*this).name();
    }
}

class NotWorkEvent
{
public:
    virtual std::string getEventType()
    {
        return typeid(this).name();
    }
};
struct EventCallBak
{
    long funcId_;
    EventConsumeFunc func_;
};

class EventBus
{
public:
    EventBus()
        : callbackId_(0)
    {}

    void publish(std::shared_ptr<Event> event)
    {
        std::lock_guard<std::recursive_mutex> lock(mutex_);
        for (auto msgCb : callbackMap_)
        {
            if (event->getEventType() == msgCb.first)
            {
                for (EventCallBak cb : msgCb.second)
                {
                    cb.func_(event);
                }
            }
        }
    }
    template<typename T>
    long registerHandler(EventConsumeFunc func)
    {
        std::string type = typeid(T).name();
        std::lock_guard<std::recursive_mutex> lockGuard(mutex_);
        EventCallBak cb;
        cb.funcId_ = callbackId_++;
        cb.func_ = func;
        auto it = callbackMap_.find(type);
        if (it == callbackMap_.end())
        {
            std::vector<EventCallBak> cbs;
            cbs.push_back(cb);
            callbackMap_[type] = cbs;
        }
        else
        {
            it->second.push_back(cb);
        }
        return cb.funcId_;
    }
    
    std::map<std::string, std::vector<EventCallBak>> callbackMap_;
    mutable std::recursive_mutex mutex_;
    long callbackId_;
    };

下面是测试代码:

代码语言:javascript
复制
    class AnEvent : public Event
    {
    };

std::shared_ptr<EventBus> eventBus = std::make_shared<EventBus>();
int eventCaller = eventBus_->registerHandler<AnEvent>(
        [&](std::shared_ptr<Event> event)
        {
            std::shared_ptr<AnEvent> typedEvent = std::dynamic_pointer_cast<AnEvent>(event);
            EXPECT_TRUE(typedEvent != nullptr);
        });

测试结果:

如果将事件定义为“事件”类,则

  1. 将正确处理AnEvent;如果将事件定义为"NotWorkEvent“类,则不会触发AnEvent。

我的问题是:

1. typeid(*this)、typeid(this)和typeid(varname)之间有什么区别?

2.模板和typeid(*this)中的typeid(T).name()返回的值(除用于任何编译器和.name版本之外)是否相同?

EN

回答 1

Stack Overflow用户

发布于 2020-12-04 07:48:51

1. typeid(*this)、typeid(this)和typeid(varname)之间有什么区别?

*this是对对象的lvalue引用,this是指向对象的指针。在引用上应用typeid时,可以获得引用对象的动态类型的类型信息(如果该类型是动态的)。在指针上应用typeid时,可以获得指针类型的类型信息。

2.由typeid(T).name()返回的相同值(用于任何编译器和C++版本)

不是的。名称是定义的实现,不同语言实现的名称是不同的。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/65138898

复制
相关文章

相似问题

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