我有类似以下内容:

template <typename T>
class A {
public:
    typedef T Type;
};

template <typename...> class B;

template <typename TFirst, typename... TRest>
class B<TFirst, TRest...> : public B<TRest...> {
public:
    typedef typename TFirst::Type Type;

    TFirst a;

    virtual void func(TFirst a, Type t) = 0;
};

template <>
class B<> {};

struct X {};
struct Y {};

class ASub1 : public A<X> {};
class ASub2 : public A<Y> {};

class BSub : public B<ASub1, ASub2> {
public:
    // Implement all pure virtual methods
    // void func(ASub1 a1, Type t) override {}
    // void func(ASub2 a2, Type t) override {}
};

现在我有两个问题:
  • 我将如何在BSub中实现所有纯虚方法?我以某种方式需要访问所有ASubX的模板参数(类型)。
  • 是否可以通过传递a来访问所有成员ASubX?我的意思是如果get<ASub1>(b_sub)b_sub的实例,则类似于BSub

  • 我希望使用C++ 14解决方案。

    最佳答案

    对于(1),您可以编写

    class BSub : public B<ASub1, ASub2> {
    public:
        void func (ASub1, typename ASub1::Type) override {}
        void func (ASub2, typename ASub2::Type) override {}
    };
    

    或者,记住ASub1::TypeXASub2::TypeY
    class BSub : public B<ASub1, ASub2> {
    public:
        void func (ASub1, X) override {}
        void func (ASub2, Y) override {}
    };
    

    对于W.F.建议的(2),您可以使用
    b_sub.B<ASub1, ASub2>::a
    

    访问ASub1组件,并
    b_sub.B<ASub2>::a
    

    访问ASub2一个。

    以下是完整的工作(简化)示例
    #include <iostream>
    #include <type_traits>
    
    template <typename T>
    struct A
     { using Type = T; };
    
    template <typename...>
    struct B;
    
    template <typename TFirst, typename ... TRest>
    struct B<TFirst, TRest...> : public B<TRest...>
     {
        using Type = typename TFirst::Type;
    
        TFirst a;
    
        virtual void func (TFirst a, Type t) = 0;
     };
    
    template <>
    struct B<> {};
    
    struct X {};
    struct Y {};
    
    struct ASub1 : public A<X> {};
    struct ASub2 : public A<Y> {};
    
    struct BSub : public B<ASub1, ASub2>
     {
       void func (ASub1, X) override { std::cout << 1 << std::endl; }
       void func (ASub2, Y) override { std::cout << 2 << std::endl; }
     };
    
    int main()
     {
       BSub bs;
    
       bs.func(ASub1{}, X{});
       bs.func(ASub2{}, Y{});
    
       using T1 = decltype(bs.B<ASub1, ASub2>::a);
       using T2 = decltype(bs.B<ASub2>::a);
    
       static_assert(std::is_same<T1, ASub1>{}, "!");
       static_assert(std::is_same<T2, ASub2>{}, "!");
     }
    

    关于c++ - 通过类型获取具有递归继承的可变参数模板的阴影成员,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/47455154/

    10-11 17:02