我有一个超类A和几个子类(B,C,D ...),其中一些类也是超类,所以这些类的关系有点复杂。
现在,我介绍了带有几种纯虚拟方法的接口类I。此接口在A的不同子类中实现
class A { };
class I { };
class B : public A, public I { };
class C : public A { };
class D : public C, public I { };
我想调用一个将A指针作为参数接收的函数,因为该函数使用A超类的功能。但是该函数希望此参数也可以实现该接口。在上面的示例中,该函数应仅接受B和D类型
我正在使用动态强制转换检查此arg是否为I的指针
void f(A *obj)
{
I *interface = dynamic_cast <I *>(obj);
if (interface) ...
}
但是我想知道c ++是否允许我提供更好的解决方案,并在编译时进行检查。
谢谢
如果要强制执行编译时间限制,这两个A
和I
你传递任何指针的基类,你可以用std::enable_if
和std::is_base_of
:
template <typename T>
typename std::enable_if<
std::is_base_of<A, T>::value && std::is_base_of<I, T>::value
>::type foo(T* t) {
}
foo
如果t
指向同时继承自A
和的类,则将仅在重载分辨率集中I
。这是否对您来说是一个好的解决方案,取决于您是否要允许以下内容:
A* a = new B;
foo(a); // it *is* a B, but will fail to instantiate the call
// because I is not a base of A
请注意,is_base_of
允许作为A
的private
基础T
。如果要强制要求它是可访问的基础,则可以改用std::is_convertible
:
template <typename T>
typename std::enable_if<
std::is_convertible<T*, A*>::value &&
std::is_convertible<T*, I*>::value
>::type foo(T* t) {
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句