当我发现创建模板类的这种依赖于预处理器的方法时,我只是在搞砸:
#include <iostream>
#include <typeinfo>
// Is this a valid template class?
#define TEMPLATE_CLASS(T)\
class TemplateClass_ ## T\
{\
private:\
T value;\
public:\
void print_type()\
{\
std::cout << typeid(T).name() << std::endl;\
}\
}
class Sample {};
TEMPLATE_CLASS(int) obj1;
TEMPLATE_CLASS(char) obj2;
TEMPLATE_CLASS(Sample) obj3;
int main(int argc, char* argv[])
{
obj1.print_type();
obj2.print_type();
obj3.print_type();
}
我简单地编译了这个:
g++ src.cpp -o main.exe
输出:
i
c
6Sample
现在,如您所见,它的工作方式与模板类几乎相同。除了一个明显的事实之外,对象只能在全局范围内声明,因为它实际上在您使用时定义了一个新类 inline TEMPLATE_CLASS(T)
,而新类不能在函数中定义。对此的解决方案可以是:
TEMPLATE_CLASS(float);
int main() { TemplateClass_float obj; }
不管怎样,这给了我很多思考。首先,这甚至可以称为有效的泛型类吗?那么,它可以用来代替标准模板功能吗?显然,使用标准模板功能要方便得多,但我的意思是,这也可以吗?最后,由 C++ 标准定义的模板功能是否在内部执行类似于我对预处理器所做的事情?如果不是,这个实现和 C++ 的标准模板特性有什么区别?