这个问题出现在我参加的课程中。考虑:
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
来提供此信息。)
答案 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;
}