加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 我可以知道多态对象是否实现了任意抽象类?

发布时间:2020-12-16 10:11:25 所属栏目:百科 来源:网络整理
导读:这个问题出现在我参加的课程中.考虑: class foo{virtual void foo_fun() = 0;};class bar{virtual void bar_fun() = 0;};templatetypename Tbool is_a_bar(T* f) { // I don't know baz. // Can I somehow know if f implements bar,T being any other type
这个问题出现在我参加的课程中.考虑:

class foo{virtual void foo_fun() = 0;};

class bar{virtual void bar_fun() = 0;};

template<typename T>
bool is_a_bar(T* f) {
    // I don't know baz.
    // Can I somehow know if f implements bar,T being any other type?
}

class baz : public foo,public bar {
    void foo_fun() override {}
    void bar_fun() override {}
};

#include <iostream>

int main() {
    foo* a{new baz};
    if (is_a_bar(a))  // Will call is_a_bar(foo*)
        std::cout << "a is also a barn";
}

是否有可能知道从foo或bar派生的任意对象是否也来自另一个…而不知道实际对象是什么?

(假设我不能改变foo或bar来提供这些信息.)

解决方法

我必须承认我并不完全确定这是你正在寻找的东西,但你可以减少所述函数的候选资格,以便只使用SFINAE对多态类很好,并利用dynamic_cast<>查询您要查找的内容.

就像是:

template<typename T>
typename std::enable_if<std::is_polymorphic<T>::value,bool>::type
is_a_bar(T* f)
{
    return dynamic_cast<bar const*>(f) != nullptr;
}

任何使用void *或一些非多态T都会在编译时呕吐(显然包括void).

祝你好运.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读