我有以下代码段,并试图了解其工作方式:
#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
实例化OurClass
,OurClass<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>
(已选择常规模板; Type
是int
,Types...
是float, Test
)被定义为// 2: Types... is float, Test
using BaseType = General<typename BaseHelper<float, Test>::BaseType>;
下一步:BaseType
中的BaseHelper<float, Test>
(已选择常规模板; Type
是float
,Types...
是Test
)被定义为// 3: Types... is Test
using BaseType = General<typename BaseHelper<Test>::BaseType>;
下一步:定义BaseType
中的BaseHelper<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>::BaseType
是General<General<General<GenBase>>>
。关于c++ - 使用此可变参数模板如何工作?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53747784/