C++模板参数替换的理解

仍是邓俊辉老师数据结构中List那一章的例子。
List的遍历问题。windows

main.cpp里调用
PRINT ( La ); // La是一个自定义的List对象数据结构

PRINT这个宏的定义就在main.cpp里
#define PRINT(x) { print(x); crc(x); checkOrder(x); }函数

print的声明在UniPrint/print.h里指针

template <typename T> static void print ( T& x ) {  UniPrint::p ( x );  }
#include "print_implementation.h"

注意C++模板类的定义和实现必需要在同一个文件中,一般是头文件,由于编译器要看到模板实现才能展开模板。
可是print.h里的模板类UniPrint只有方法的声明,没有方法的实现。
因此print.h的末尾引入了print_implementation.h这个头文件。UniPrint::p的实现就在这个头文件里。
这也是C++模板类的经常使用写法。code

print_implementation.h里又引入了Print_traversable.h,UniPrint::p的真正实如今Print_traversable.h里。(windows上C++头文件不分大小写)对象

print_traversable.h编译器

template <typename T> //元素类型
void UniPrint::p ( T& s ) { //引用
   printf ( "%s[%d]*%d:\n", typeid ( s ).name(), &s, s.size() ); //基本信息
   s.traverse ( print ); //经过print()遍历输出全部元素
   printf ( "\n" );
}

运行到s.traverse( print );这一句的时候会跳到traverse方法里去。it

list.hio

template <typename T> void List<T>::traverse ( void ( *visit ) ( T& ) )//借助函数指针机制遍历
{
    for (ListNodePosi(T) p = header->succ; p != trailer; p = p->succ) { printf("%s", "sss"); visit(p->data); }
    // 由于T已经被替换成了int。因此这里的visit实际上是UnitPrint::p的模板实例,在print_basic.cpp里
}

从traverse方法来看,它接收的是一个函数指针,这个函数接收一个T型引用的参数,且没返回值。
因此s.traverse ( print );中print方法也应该接收一个T型引用的参数。
纵观print.h中只有这一句符合条件:template <typename T> static void print ( T& x ) { UniPrint::p ( x ); }编译

咦?不对呀,这怎么又回来了?怕不是死循环?

相关文章
相关标签/搜索