用C++做模板的另一种方法是什么?

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++的标准模板功能有什么区别?

Pet*_*ker 7

它只在最简单的情况下与模板做同样的事情.尝试使用宏:

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)