这个使用 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();
};
using BaseType = General<typename BaseHelper<Types... >::BaseType>
为什么最后需要::BaseType
?
如果我们用OurClass<int,float,Test>
实例化它,BaseType
在OurClass
中包含什么类型?
General<typename BaseHelper<Types... >::BaseType
访问 using BaseType = General<GenBase>
类型,它可以访问 void BaseClass()
函数。
使用该构造函数将调用 BaseHelper <Type, Types...>
,因此您将获得 BaseHelper
以及 Type = int
和 Types = 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 通过 using
在 General<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;Type
是 int
,Types...
是 float, Test
) 定义为
// 2: Types... is float, Test
using BaseType = General<typename BaseHelper<float, Test>::BaseType>;
下一步:BaseHelper<float, Test>
中的 BaseType
(通用模板 selected;Type
是 float
,Types...
是 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>::BaseType
是General<General<General<GenBase>>>
。
我有这段代码,正在尝试了解它的工作原理:
#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
?如果我们用
OurClass<int,float,Test>
实例化它,BaseType
在OurClass
中包含什么类型?
General<typename BaseHelper<Types... >::BaseType
访问using BaseType = General<GenBase>
类型,它可以访问void BaseClass()
函数。使用该构造函数将调用
BaseHelper <Type, Types...>
,因此您将获得BaseHelper
以及Type = int
和Types = 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 通过 using
在 General<typename BaseHelper<Types... >
BaseType
What type would
BaseType
contain inOurClass
if we instantiate it withOurClass<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;Type
是 int
,Types...
是 float, Test
) 定义为
// 2: Types... is float, Test
using BaseType = General<typename BaseHelper<float, Test>::BaseType>;
下一步:BaseHelper<float, Test>
中的 BaseType
(通用模板 selected;Type
是 float
,Types...
是 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>::BaseType
是General<General<General<GenBase>>>
。