gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 12:42:06 24 4
gpt4 key购买 nike

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com