我有以下代码段,并试图了解其工作方式:

#include <iostream>

class GenBase
{
public:
    void BaseClass()
    {
        std::cout << " BaseClass " << std::endl;
    }
};

template <class Base>
class General: public Base
{
    public:
        void PrintGeneral()
        {
            std::cout << " General " << std::endl;
        }
};

template <typename... Types>
struct BaseHelper;

template <typename Type, typename... Types>
struct BaseHelper< Type, Types...>
{
    using BaseType = General<typename BaseHelper<Types... >::BaseType>;
};

template <typename Type>
struct BaseHelper<Type>
{
    using BaseType = General<GenBase>;
};

template <typename... Types>
class OurClass: public BaseHelper<Types...>::BaseType
{
public:
     void print_smth()
     {
        BaseType::PrintGeneral();
     }

private:
     using BaseType = typename BaseHelper<Types...>::BaseType;
};

class Test
{
  public:
      void foo();
};
  • using BaseType = General<typename BaseHelper<Types... >::BaseType>
    为什么最后需要::BaseType
  • 如果我们使用BaseType实例化OurClassOurClass<int,float,Test>将包含什么类型?
  • 最佳答案

    General<typename BaseHelper<Types... >General<typename BaseHelper<Types... >::BaseType是不同的类型;使用::BaseType,您可以通过BaseType内的using选择定义的General<typename BaseHelper<Types... >
    您将BaseType定义为General<General<General<GenBase>>>
    我将逐步向您展示如何获得该类型。
    您有OurClass<int,float,Test>,所以Types...int, float, Test,所以

    // 1: Types... is int, float, Test
    using BaseType = typename BaseHelper<int, float, Test>::BaseType;
    
    下一步:BaseType中的BaseHelper<int, float, Test>(已选择常规模板; TypeintTypes...float, Test)被定义为
    // 2: Types... is float, Test
    using BaseType = General<typename BaseHelper<float, Test>::BaseType>;
    
    下一步:BaseType中的BaseHelper<float, Test>(已选择常规模板; TypefloatTypes...Test)被定义为
    // 3: Types... is Test
    using BaseType = General<typename BaseHelper<Test>::BaseType>;
    
    下一步:定义BaseType中的BaseHelper<Test>(选择了部分特化BaseHelper<Type>,其中TestType)
    // 4
    using BaseType = General<GenBase>;
    
    下一步:我们将General<GenBase>替换为3,所以
    // 3: BaseHelper<Test>::BaseType> is General<GenBase>
    using BaseType = General<General<GenBase>>;
    
    下一步:我们将General<General<GenBase>>替换为2,因此
    // 2: BaseHelper<float, Test>::BaseType is General<General<GenBase>>
    using BaseType = General<General<General<GenBase>>>;
    
    最后一步:我们将General<General<General<GenBase>>>替换为1,
    // 1: BaseHelper<int, float, Test>::BaseType is General<General<General<GenBase>>>
    using BaseType = General<General<General<GenBase>>>;
    
    结论:OurClass<int,float,Test>::BaseTypeGeneral<General<General<GenBase>>>

    关于c++ - 使用此可变参数模板如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53747784/

    10-10 06:20