面试题答案
一键面试在C++中,#error
指令用于在编译时生成错误信息。当预处理器遇到 #error
指令时,它会停止编译并显示指定的错误信息。
假设我们有一个模板函数来处理不同类型数据的加法运算,但我们希望确保传入的类型是数值类型,以避免因基础数据类型不匹配导致错误。可以使用 #error
结合模板特化和类型特征(type traits)来实现这一点。
以下是一个示例:
#include <type_traits>
// 通用模板函数声明
template<typename T1, typename T2>
auto add(T1 a, T2 b) -> decltype(a + b);
// 模板特化,检查T1和T2是否为数值类型
template<typename T1, typename T2>
typename std::enable_if<std::is_arithmetic<T1>::value && std::is_arithmetic<T2>::value, decltype(T1() + T2())>::type
add(T1 a, T2 b) {
return a + b;
}
// 处理非数值类型的情况,使用#error
template<typename T1, typename T2>
typename std::enable_if<!(std::is_arithmetic<T1>::value && std::is_arithmetic<T2>::value), decltype(T1() + T2())>::type
add(T1 a, T2 b) {
#error "Both types must be arithmetic for addition"
return decltype(T1() + T2())();
}
int main() {
int a = 5;
double b = 3.5;
add(a, b); // 正确,int和double都是数值类型
// 假设我们有一个自定义结构体
struct MyStruct {};
MyStruct s1, s2;
// add(s1, s2); // 编译错误,MyStruct不是数值类型,会触发#error
return 0;
}
在上述代码中:
- 我们定义了一个通用的
add
模板函数声明。 - 然后使用
std::enable_if
和std::is_arithmetic
来检查T1
和T2
是否为数值类型。如果是,就使用正常的加法实现。 - 如果
T1
或T2
不是数值类型,就使用#error
指令在编译时抛出错误信息"Both types must be arithmetic for addition"
。
这样,在代码审查时,如果有人尝试对非数值类型调用 add
函数,编译就会失败并显示明确的错误信息,从而快速发现因基础数据类型不匹配可能导致的错误。