c++ - 我能知道多态对象是否实现了任意抽象类吗?

标签 c++ c++11

这个问题是在我参加的类(class)中提出的。考虑:

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 来提供此信息。)

最佳答案

我必须承认我不完全确定这就是您要找的东西,但是您可以减少 said-function 的候选资格以仅使用 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 )。

祝你好运。

关于c++ - 我能知道多态对象是否实现了任意抽象类吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30281228/

相关文章:

image - 将 3 channel 图像转换为 T 型单向量的最快方法

C++ 互质问题。优化代码

c++ - std::thread with tbb - 使用 2 个或更少的参数构建

c++ - 迭代 OpenCl 内核

c++ - 在 Windows 上使用 Xerces 3.0.1 和 C++ 编写 XML

c++ - 使用 operator[] 访问 unique_ptr 的私有(private) std::map

c++ - 如何在不进行类型转换和使用多态性的情况下使用基类指针调用派生类非虚成员函数?

c++ - 在 C++ 中乘以大数 - 代码有错误吗?如何改进?

c++ - 可以将过期的weak_ptr 与未初始化的weak_ptr 区分开来吗?

linux - CMake:未使用 CXX_STANDARD 设置 C++11