面试题答案
一键面试-
使用类型萃取(Type Traits):
- C++标准库提供了类型萃取工具,可用于判断类型。这里我们可以使用
std::is_same
来判断T
是否为Derived1
类型。
#include <type_traits> template <typename T> void process(T obj) { if constexpr (std::is_same_v<T, Derived1>) { // 针对Derived1类型的操作 } else { // 针对其他类型(这里是Derived2等非Derived1类型)的操作 } }
- C++标准库提供了类型萃取工具,可用于判断类型。这里我们可以使用
-
模板特化:
- 可以对
process
函数模板进行全特化来处理Derived1
类型。
template <> void process<Derived1>(Derived1 obj) { // 针对Derived1类型的特化操作 } template <typename T> void process(T obj) { // 针对其他类型(如Derived2)的通用操作 }
- 可以对
-
模板偏特化(在C++中函数模板不能偏特化,这里可以用类模板辅助实现类似效果):
- 定义一个类模板来辅助实现。
template <typename T> struct ProcessHelper { static void process(T obj) { // 通用操作 } }; template <> struct ProcessHelper<Derived1> { static void process(Derived1 obj) { // 针对Derived1的特殊操作 } }; template <typename T> void process(T obj) { ProcessHelper<T>::process(obj); }
上述方法中,使用
if constexpr
结合std::is_same
在C++17及以后是一种较为简洁的方式,能在编译期完成判断,不产生运行时开销。模板特化也是一种常用手段,针对特定类型提供专门实现。而通过类模板辅助实现的类似偏特化的方式,在某些场景下也有其优势,如代码结构更清晰等。