可变参数模板的多重继承:如何为每个基类调用函数?

我有一个钻石继承计划,其中最后一个孩子应该能够从许多不同的父母那里继承下来。

     A
    /|\
   / | \
  B  C  ...
  |  |  |
    * *
    D E

现在,假设我有一个class D : public B,,class E : public B, public C等等。D我想从其所有父项中调用相同的函数,由于继承,我保证该函数存在。我的想法是我可以将其包装在可变参数的模板中。

目前我有这个:

template <typename T>
class A
{
public:
    A(T t) : mT(t) {}
    virtual ~A() {}
    virtual void doThings() = 0;
protected:
    T mT;
};

template <typename T, typename A = A<T>>
class B : public A
{
public:
    B(T t) : A(t) {}
    virtual ~B() {}
    virtual void doThings() { std::cout << "B" << std::endl; }
};

template <typename T, typename A = A<T>>
class C : public A
{
public:
    C(T t) : A(t) {}
    virtual ~C() {}
    virtual void doThings() { std::cout << "C" << std::endl; }
};

现在我想我可以做这样的事情,但是显然行不通:

template <typename T, typename ...Args>
class ChildGenerator : public Args...
{
public:
    ChildGenerator(T t) : Args(t)... {}

    // The unpacking of the variadic template does not work here.
    // Do I need to make it recursive somehow? How can I do that without having to instantiate new classes B and C?
    void doThings() override { Args...::doThings();}
};

我希望我可以这样使用它:

int main()
{
    using B = B<double>;
    using C = C<double>;
    B c1(0.0);
    C c2(1.0);
    ChildGenerator<double, B, C> c3(2.0);
    c1.doThings();
    c2.doThings();
    c3.doThings();
 }

预期输出(顺序无关紧要):

B
C
B // <-- order of these two does not matter
C // <--

我正在努力实现的目标有可能吗?

贾罗德42

遍历可变参数基数的一种方法:

template <typename T, typename ...Args>
class ChildGenerator : public Args...
{
public:
    ChildGenerator(T t) : Args(t)... {}

    void doThings() override {
        int dummy[] = {0, (Args::doThings(), void(), 0)...};
        static_cast<void>(dummy); // avoid warning for unused variable
    }
};

或在C ++ 17中,带有折叠表达式:

    void doThings() override {
        (static_cast<void>(Args::doThings()), ...);
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何扩展对可变参数模板基类的调用?

可变参数模板多继承函数调用上的歧义访问

C ++ 11中的可变参数模板和多重继承

如何使可变参数模板类方法以函数指针作为从函数模板派生的类型作为参数?

python多重继承,调用基类函数

decltype()可变参数模板基类

基准可变参数模板函数调用

如何将元函数应用于可变参数模板类的模板类型?

如何使用可变参数模板参数进行模板函数调用?

是否可以从可变参数模板调用多个基类构造函数?

如何在SWIG中包装可变参数模板类的可变参数模板成员函数?

可变参数模板类中的派生(虚拟)函数参数

如何为std :: string可变参数模板参数调用c_str()?

如何扩展可变参数模板类

调用类内的函数的C ++ 11可变参数模板

没有匹配函数调用可变参数模板函数

C ++:如何在可变参数模板参数上调用带有类型参数的函数?

如何传递可变参数模板函数?

通过可变参数模板的C ++ 11构造函数继承

基于可变参数模板的两个交互类的多重继承...

如何重载可变参数模板函数?

可变参数模板类和调用构造函数中的多重继承

为每个可变参数模板参数调用函数,并将结果作为构造函数参数传递

以可变参数类模板作为函数调用参数的函数模板参数推导

可变参数模板类-可变参数成员函数

使用成员函数调用可变参数模板函数

当可变参数模板类从模板参数继承时,在调用基类型的方法时扩展参数包

如何检查类型是否从模板函数中的某个可变参数模板类实例化?

使用可变参数类模板的模板参数调用可变参数函数模板?