gpt4 book ai didi

c++ - 强制接收实现接口(interface)的父类(super class)指针作为方法的参数

转载 作者:太空狗 更新时间:2023-10-29 20:57:37 27 4
gpt4 key购买 nike

我有一个父类(super class) A 和几个子类(B、C、D...),其中一些类也是父类(super class),所以这些类的关系有点复杂。

现在我已经介绍了一个带有几个纯虚方法的接口(interface)类I。该接口(interface)在A的不同子类中实现

class A { };

class I { };

class B : public A, public I { };

class C : public A { };

class D : public C, public I { };

我想调用一个接收 A 指针作为参数的函数,因为该函数使用 A 父类(super class)的功能。但是函数期望这个参数也实现了接口(interface)。在上面的例子中,函数应该只接受 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 指向同时继承自 AI< 的类时才会出现在重载决议集中。这对您来说是否是一个好的解决方案取决于您是否允许这样的事情:

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 成为Tprivate 基。如果你想强制它是一个可访问的基础,你可以改为使用 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) {

}

关于c++ - 强制接收实现接口(interface)的父类(super class)指针作为方法的参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30005384/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com