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

标签 c++ c++11 variadic-templates

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

#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. 什么类型会 BaseType包含在 OurClass 中如果我们用 OurClass<int,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您选择 BaseType定义,通过 using , 里面 General<typename BaseHelper<Types... >

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;

下一步:BaseTypeBaseHelper<int, float, Test> (选择了通用模板;TypeintTypes...float, Test )定​​义为

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

下一步:BaseTypeBaseHelper<float, Test> (选择了通用模板;TypefloatTypes...Test )定​​义为

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

下一步:BaseTypeBaseHelper<Test> (部分特化 BaseHelper<Type> ,选择 Test 作为 Type )定​​义为

// 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++ - 这个使用 using 的可变参数模板如何工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53747784/

相关文章:

c++ - 循环可变参数模板类参数

c++ - 如何检测作为参数传递的函数的参数类型?

c++ - 在没有 std::index_sequence 的人工层的情况下就地解压 std::tuple

c++ - C++中Main函数的参数

C++ 如何使用 _rmdir 删除文件?

c++ - 使用编译时已知的常量 array1 初始化 C++ array2

c++ - 如何在我自己的赋值运算符中调用默认赋值运算符?

c++ - 将数字 append 到 int 而不转换为字符串?

c++ - 使用 C++ 11lambda boost 线程

c++ - 编译时的模板和 constexpr 推导取决于编译器和优化标志