gpt4 book ai didi

c++ - 如何在模板类中调用继承类的函数

转载 作者:太空宇宙 更新时间:2023-11-03 10:37:33 25 4
gpt4 key购买 nike

如果一个类继承多个具有相同功能的类,如何在不手动指定每个类的情况下调用每个继承类的功能?

示例代码如下:

#include <cstdio>

class Interface1
{
public:
virtual ~Interface1() = default;
void foo()
{
printf("%s\n", __PRETTY_FUNCTION__);
}
};

class Interface2
{
public:
virtual ~Interface2() = default;
void foo()
{
printf("%s\n", __PRETTY_FUNCTION__);
}
};

class ObjectWithoutTemplate : public Interface1, Interface2
{
public:
void foo()
{
// How do I write the code to call each InterfaceX's foo() here
// without manually specify each class?
Interface1::foo();
Interface2::foo();
// The desired code looke like
// for each interface in Interfaces {
// interface::foo()
// }
}
};

template <class... Interfaces>
class ObjectWithTemplate : Interfaces...
{
public:
void foo()
{
// It does not compile if the template does not inherit Interface[1|2]
Interface1::foo();
Interface2::foo();
// The desired code looke like
// for each interface in Interfaces {
// interface::foo()
// }
}
};
int main()
{
ObjectWithoutTemplate objWithout;
ObjectWithTemplate<Interface1, Interface2> objWith;
objWithout.foo();
objWith.foo();
return 0;
}

对于 ObjectWithoutTemplate,我可以通过手动指定接口(interface)来调用接口(interface)的 foo():

    Interface1::foo();
Interface2::foo();

但对于 ObjectWithTemplatefoo(),我该如何编写代码来调用每个继承接口(interface)的 foo(),考虑到还有Interface3, Interface4

最佳答案

假设您不希望重复任何碱基(并且没有任何碱基相互继承),您可以这样做;

template <class FirstInterface, class... Interfaces>
class ObjectWithTemplate : public FirstInterface, public ObjectWithTemplate<Interfaces...>
{
public:
void foo()
{
FirstInterface::foo();
ObjectWithTemplate<Interfaces...>::foo();
};
};

// partial specialisation
template<class LastInterface>
class ObjectWithTemplate<LastInterface> : public LastInterface
{
public:
void foo()
{
LastInterface::foo();
};
};

类型的对象

ObjectWithTemplate<Interface1, Interface2> object;

实际上有 Interface1ObjectWithTemplate<Interface2>作为基类。 ObjectWithTemplate<Interface2> ,反过来,有 Interface2作为基类。

如果您重复碱基,或使用共享另一个碱基的两个碱基,例如

ObjectWithTemplate<Interface1, Interface1> object;

ObjectWithTemplate<Interface1, SomethingDerivedFromInterface1> object2;

由于歧义,代码将无法编译。

关于c++ - 如何在模板类中调用继承类的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58055393/

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