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

还是邓俊辉老师数据结构中List那一章的例子。

List的遍历问题。

main.cpp里调用

PRINT ( La ); // La是一个自定义的List对象

PRINT这个宏的定义就在main.cpp里

#define PRINT(x) { print(x); crc(x); checkOrder(x); }

print的声明在UniPrint/print.h里

template static void print ( T& x ) { UniPrint::p ( x ); }

#include "print_implementation.h"

注意C++模板类的定义和实现必须要在同一个文件中,通常是头文件,因为编译器要看到模板实现才能展开模板。

但是print.h里的模板类UniPrint只有方法的声明,没有方法的实现。

所以print.h的末尾引入了print_implementation.h这个头文件。UniPrint::p的实现就在这个头文件里。

这也是C++模板类的常用写法。

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

print_traversable.h

template //元素类型

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方法里去。

list.h

template void List::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 static void print ( T& x ) { UniPrint::p ( x ); }

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值