【发布时间】:2012-08-14 11:44:50
【问题描述】:
当我发现这种创建模板类的依赖于预处理器的方法时,我只是在搞砸:
#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
现在,如您所见,它的工作方式与模板类几乎相同。除了一个明显的事实之外,对象只能全局声明,因为当您使用TEMPLATE_CLASS(T) 时,它实际上内联定义了一个新类,并且不能在函数中定义新类。解决方案可以是:
TEMPLATE_CLASS(float);
int main() { TemplateClass_float obj; }
无论如何,这给了我很多思考。首先,这甚至可以称为有效的泛型类吗?那么,是否可以使用它代替标准模板功能?显然,使用标准模板功能要方便得多,但我的意思是,这也可以吗?最后,C++ 标准在内部定义的模板功能是否与我对预处理器所做的类似?如果不是,这个实现和 C++ 的标准模板特性有什么区别?
【问题讨论】:
-
C 没有类和函数(结构内部)!!!
-
阅读 14 par of C++ 标准...那么,宏可以遵循所有这些规则吗?
-
为什么您会使用它而不是标准模板功能?你想达到什么目的?
-
"有什么区别:"论据推演,专业化。
标签: c++ templates template-classes