强制接收实现接口的超类指针作为方法的参数

胡安·阿方索·塞拉·门切罗

我有一个超类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 ++是否允许我提供更好的解决方案,并在编译时进行检查。

谢谢

巴里

如果要强制执行编译时间限制,这两个AI你传递任何指针的基类,你可以用std::enable_ifstd::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允许作为Aprivate基础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] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章