App*_*ker 0 c++ templates template-classes
当我发现这种依赖于预处理器的创建模板类的方式时,我只是搞乱了:
#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();
}
Run Code Online (Sandbox Code Playgroud)
我简单地编译了这个:
g++ src.cpp -o main.exe
Run Code Online (Sandbox Code Playgroud)
输出:
i
c
6Sample
Run Code Online (Sandbox Code Playgroud)
现在,正如您所看到的,它几乎与模板类的工作方式相同.除了明显的事实之外,对象只能全局声明,因为它实际上在您使用时定义了一个新的内联类TEMPLATE_CLASS(T),并且无法在函数中定义新类.解决方案可以是:
TEMPLATE_CLASS(float);
int main() { TemplateClass_float obj; }
Run Code Online (Sandbox Code Playgroud)
无论如何,这给了我很多思考.首先,这甚至可以被称为有效的泛型类吗?那么,是否可以使用它而不是标准模板功能?显然,使用标准模板功能要方便得多,但我的意思是说,这个工作也一样吗?最后,C++标准内部定义的模板功能是否与我在预处理器上做的类似?如果没有,这个实现和C++的标准模板功能有什么区别?
它只在最简单的情况下与模板做同样的事情.尝试使用宏:
template <class Ty> class C {};
template <class Ty> class C<Ty*> {};
template <class Ty> class C<std::vector<Ty> > {};
Run Code Online (Sandbox Code Playgroud)