面试题答案
一键面试- 定义模板参数:
- 在
TemplateDerived
类模板定义时,声明与TemplateBase
相匹配或根据需求扩展的模板参数。例如,如果TemplateBase
定义为template <typename T1, typename T2> class TemplateBase{...}
,TemplateDerived
可以定义为template <typename T1, typename T2, typename T3> class TemplateDerived : public TemplateBase<T1, T2>{...}
,这里新增的T3
参数可用于特定的类型计算。 - 模板参数传递要确保
TemplateDerived
能正确接收并使用这些参数进行编译期计算。
- 在
- 基类与派生类模板成员交互:
- 派生类可以访问基类的模板成员。如果
TemplateBase
有模板成员函数template <typename U> void baseFunction(U u)
,TemplateDerived
可以在其成员函数中调用this->baseFunction<SomeType>(someObject)
,其中SomeType
和someObject
是合适的类型和对象,这样能复用基类的部分功能。 - 派生类也可以重写基类的模板成员函数。例如,
TemplateBase
有template <typename U> U baseCalculation(U u)
,TemplateDerived
可以定义template <typename U> U baseCalculation(U u) override {...}
,在派生类中根据自身模板参数实现不同的计算逻辑。
- 派生类可以访问基类的模板成员。如果
- 实现编译期类型计算:
- 利用模板特化技术。例如,对于不同的模板参数
T3
,可以定义不同的模板特化版本。假设T3
是一个整数类型,template <typename T1, typename T2, int N> class TemplateDerived : public TemplateBase<T1, T2>{...}
,然后针对不同的N
值定义特化版本,如template <typename T1, typename T2> class TemplateDerived<T1, T2, 0> : public TemplateBase<T1, T2>{...}
,在不同特化版本中实现不同的类型计算。 - 使用
constexpr
函数和if constexpr
语句(C++17及以后)。在TemplateDerived
的成员函数中,可以使用constexpr
函数在编译期进行计算,if constexpr
语句根据模板参数的值选择不同的计算分支。例如:
template <typename T1, typename T2, typename T3> class TemplateDerived : public TemplateBase<T1, T2>{ public: constexpr auto calculate() const { if constexpr (std::is_same_v<T3, int>) { // 针对T3为int的类型计算 return someIntCalculation(); } else if constexpr (std::is_same_v<T3, double>) { // 针对T3为double的类型计算 return someDoubleCalculation(); } } private: constexpr auto someIntCalculation() const { // 具体针对int的计算逻辑 return 0; } constexpr auto someDoubleCalculation() const { // 具体针对double的计算逻辑 return 0.0; } };
- 利用模板特化技术。例如,对于不同的模板参数