这个使用 using 的可变参数模板如何工作?

How does this variadic template with using work?

我有这段代码,正在尝试了解它的工作原理:

#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();
};
  1. using BaseType = General<typename BaseHelper<Types... >::BaseType>

    为什么最后需要::BaseType

  2. 如果我们用OurClass<int,float,Test>实例化它,BaseTypeOurClass中包含什么类型?

  1. General<typename BaseHelper<Types... >::BaseType 访问 using BaseType = General<GenBase> 类型,它可以访问 void BaseClass() 函数。

  2. 使用该构造函数将调用 BaseHelper <Type, Types...>,因此您将获得 BaseHelper 以及 Type = intTypes = float, Test,这将生成 General 输入 Types = float, Test.

using BaseType = General<typename BaseHelper<Types... >::BaseType>

Why do we need ::BaseType at the end?

General<typename BaseHelper<Types... >General<typename BaseHelper<Types... >::BaseType是不同的类型; ::BaseType 你 select 通过 usingGeneral<typename BaseHelper<Types... >

中定义了 BaseType

What type would BaseType contain in OurClass if we instantiate it with OurClass<int,float,Test>?

你知道 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;

下一步:BaseHelper<int, float, Test> 中的 BaseType(通用模板 selected;TypeintTypes...float, Test) 定义为

// 2: Types... is float, Test
using BaseType = General<typename BaseHelper<float, Test>::BaseType>;

下一步:BaseHelper<float, Test> 中的 BaseType(通用模板 selected;TypefloatTypes...Test) 定义为

// 3: Types... is Test
using BaseType = General<typename BaseHelper<Test>::BaseType>;

下一步:BaseHelper<Test> 中的 BaseType(部分专业化 BaseHelper<Type>Test 作为 Type,是 selected)定义为

// 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>>>