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). 祝你好运. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |