面试题答案
一键面试- 结合思路:
#if!defined
宏是在预编译阶段起作用,用于判断某个宏是否未定义。而模板元编程是在编译期进行计算和代码生成。- 可以通过在模板中使用
#if!defined
宏来根据模板参数的值,在预编译阶段决定是否编译特定的代码块。模板参数可以影响宏的定义,从而间接控制#if!defined
的判断结果。
- 举例实现:
// 定义一个宏用于控制编译
#ifndef MY_TEMPLATE_MACRO
#define MY_TEMPLATE_MACRO 0
#endif
// 模板类
template<int N>
class MyTemplate {
public:
void print() {
#if!defined(MY_TEMPLATE_MACRO) || MY_TEMPLATE_MACRO == 0
std::cout << "Macro is not defined or is 0, and N is: " << N << std::endl;
#elif MY_TEMPLATE_MACRO == 1
std::cout << "Macro is 1, and N is: " << N << std::endl;
#endif
}
};
int main() {
MyTemplate<10> obj;
obj.print();
return 0;
}
在上述代码中:
- 首先定义了一个宏
MY_TEMPLATE_MACRO
,如果没有定义它,会默认定义为0
。 MyTemplate
模板类的print
方法中,通过#if!defined(MY_TEMPLATE_MACRO) || MY_TEMPLATE_MACRO == 0
以及#elif MY_TEMPLATE_MACRO == 1
这样的条件判断,在预编译阶段根据宏的值来决定编译哪部分代码。- 在
main
函数中创建了MyTemplate<10>
的对象并调用print
方法,执行相应的编译后的代码。
这种方式将预编译的宏控制和模板元编程结合起来,实现了根据模板参数和宏定义进行差异化编译的功能。