面试题答案
一键面试#include <type_traits>
// 辅助模板,用于检查T1是否为整数类型,T2是否为指针类型
template <typename T1, typename T2>
struct is_valid_types {
static constexpr bool value = std::is_integral<T1>::value && std::is_pointer<T2>::value;
};
// Base模板类
template <typename T1, typename T2>
class Base {
public:
// 假设这里有一些通用的成员和方法
};
// Derived派生类,使用SFINAE机制
template <typename T1, typename T2,
typename = std::enable_if_t<is_valid_types<T1, T2>::value>>
class Derived : public Base<T1, T2> {
public:
// Derived类特有的成员和方法
};
类型推导和SFINAE机制协同工作解释
- 类型推导:在实例化
Derived
类模板时,编译器需要确定模板参数T1
和T2
的具体类型。这些类型是从用户提供的模板实参中推导出来的。 - SFINAE机制:
std::enable_if_t<is_valid_types<T1, T2>::value>
是SFINAE机制的关键部分。std::enable_if
是一个类型特性模板,它根据给定的条件(这里是is_valid_types<T1, T2>::value
)来决定是否定义一个类型。如果条件为真(is_valid_types<T1, T2>::value
为true
),std::enable_if_t<is_valid_types<T1, T2>::value>
会定义为void
(因为std::enable_if<true, void>::type
就是void
),此时Derived
类模板实例化成功。如果条件为假(is_valid_types<T1, T2>::value
为false
),std::enable_if_t<is_valid_types<T1, T2>::value>
不会定义类型,导致模板实例化失败。但由于SFINAE机制,这种失败不会导致编译错误,只是该模板实例化被忽略。
条件不满足时编译器错误信息
如果条件不满足,编译器会给出类似“no type named 'type' in'std::enable_if<false, void>'”的错误信息。这是因为std::enable_if
在条件为假时不会定义type
成员,从而导致模板实例化失败。具体的错误信息可能因编译器而异,但核心都是关于std::enable_if
未能定义所需类型的问题。