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

时间:2015-05-16 22:02:52

标签: c++ c++11

这个问题出现在我参加的课程中。考虑:

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 bar\n";
}

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

(假设我无法更改foobar来提供此信息。)

2 个答案:

答案 0 :(得分:6)

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

类似的东西:

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)。

祝你好运。

答案 1 :(得分:5)

如果使用RTTI编译代码,可以使用dynamic_cast:

template<typename T>
bool is_a_bar(T* f) {
    return dynamic_cast<bar*>(f) != nullptr;
}