这个问题是在我参加的类(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";
}
是否有可能知道派生自 foo
或 bar
的任意对象是否也派生自另一个...不知道实际对象是什么?
(假设我无法更改 foo
或 bar
来提供此信息。)
最佳答案
我必须承认我不完全确定这就是您要找的东西,但是您可以减少 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/