C++函数模板之模板参数的嵌套传递

以函数“指针“作为模板参数传递给函数模板,该函数“指针“即可以是普通函数,又可以是函数模板。


#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <iostream>

using namespace std;

template<typename T, void(*pVisit)(T&)>
void foreach(T array[], int num)
{
int i = 0;

for(i=0; i<num; i++){
pVisit(array[i]);
}
}

template<typename T>
void print(T& a)
{
cout <<__FUNCTION__<<" "<<a<<endl;
}

template<typename T, void (*pShow)(T&)>
void show_common(T& a)
{
cout <<__FUNCTION__<<" now call pShow:"<<endl;
pShow(a);
}

template<typename T, void (*pShow2)(T&)>
void show_common2(T& a)
{
cout <<__FUNCTION__<<" now call pShow2:"<<endl;
pShow2(a);
}

template<typename T>
void real_show(T& a)
{
cout <<__FUNCTION__<<" a: "<<a<<endl;
}

void show_string(string &s)
{
cout <<__FUNCTION__<<" string: "<<s<<endl;
}

int main(int argc, char**argv)
{
int alist[] = {1,2,3,4,5};
string slist[] = {"aaa", "bbb", "ccc"};

//将一个 普通函数实例 show_string 做为 foreach 的模板参数
foreach<string, show_string >(slist, sizeof(slist)/sizeof(slist[0]));

//将 函数模板 print 作为 foreach 的模板参数传递给foreach
foreach<int, print<int> >(alist, sizeof(alist)/sizeof(alist[0]));
foreach<string, print<string> >(slist, sizeof(slist)/sizeof(slist[0]));

//三层模板嵌套
foreach<int, show_common<int,real_show<int> > >(alist, sizeof(alist)/sizeof(alist[0]));

//四层模板嵌套
foreach<int, show_common<int,show_common2<int, real_show<int> > > >(alist, sizeof(alist)/sizeof(alist[0]));

return 0;
}


==============================================================================
用nm命令查看生成的函数符号,发现5次不同的foreach调用,生成了5个不同的函数实例:
000000000040111c W _Z7foreachIiXadL_Z11show_commonIiXadL_Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS4_EEEvS4_EEEvPS3_i
000000000040104d W _Z7foreachIiXadL_Z11show_commonIiXadL_Z9real_showIiEvRT_EEEvS3_EEEvPS2_i
0000000000400e9c W _Z7foreachIiXadL_Z5printIiEvRT_EEEvPS1_i
0000000000400f74 W _Z7foreachISsXadL_Z11show_stringRSsEEEvPT_i
0000000000400f2b W _Z7foreachISsXadL_Z5printISsEvRT_EEEvPS1_i

几次嵌套调用,还生成了几个“中间“符号,例如,
show_common<int,real_show<int> > 生成了:
000000000040100a W _Z11show_commonIiXadL_Z9real_showIiEvRT_EEEvS2_

show_common2<int, real_show<int> > 生成了:
0000000000401096 W _Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS2_

show_common<int,show_common2<int, real_show<int> > > 生成了:
00000000004010d9 W _Z11show_commonIiXadL_Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS3_EEEvS3_


====================================================================================================
[lubo@localhost function]$ nm a.out
00000000004010d9 W _Z11show_commonIiXadL_Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS3_EEEvS3_
000000000040100a W _Z11show_commonIiXadL_Z9real_showIiEvRT_EEEvS2_
0000000000400bb0 T _Z11show_stringRSs
0000000000401096 W _Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS2_
0000000000400dfd t _Z41__static_initialization_and_destruction_0ii
0000000000400e4f W _Z5printIiEvRT_
0000000000400ee5 W _Z5printISsEvRT_
000000000040111c W _Z7foreachIiXadL_Z11show_commonIiXadL_Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS4_EEEvS4_EEEvPS3_i
000000000040104d W _Z7foreachIiXadL_Z11show_commonIiXadL_Z9real_showIiEvRT_EEEvS3_EEEvPS2_i
0000000000400e9c W _Z7foreachIiXadL_Z5printIiEvRT_EEEvPS1_i
0000000000400f74 W _Z7foreachISsXadL_Z11show_stringRSsEEEvPT_i
0000000000400f2b W _Z7foreachISsXadL_Z5printISsEvRT_EEEvPS1_i
0000000000400fbd W _Z9real_showIiEvRT_
U _ZNSaIcEC1Ev@@GLIBCXX_3.4
U _ZNSaIcED1Ev@@GLIBCXX_3.4
U _ZNSolsEi@@GLIBCXX_3.4
U _ZNSolsEPFRSoS_E@@GLIBCXX_3.4
U _ZNSsC1EPKcRKSaIcE@@GLIBCXX_3.4
U _ZNSsD1Ev@@GLIBCXX_3.4
U _ZNSt8ios_base4InitC1Ev@@GLIBCXX_3.4
U _ZNSt8ios_base4InitD1Ev@@GLIBCXX_3.4
00000000006020a0 B _ZSt4cout@@GLIBCXX_3.4
U _ZSt4endlIcSt11char_traitsIcEERSt13basic_ostreamIT_T0_ES6_@@GLIBCXX_3.4
00000000006021b4 b _ZStL8__ioinit
U _ZStlsIcSt11char_traitsIcESaIcEERSt13basic_ostreamIT_T0_ES7_RKSbIS4_S5_T1_E@@GLIBCXX_3.4
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@@GLIBCXX_3.4
000000000040126e r _ZZ11show_commonIiXadL_Z12show_common2IiXadL_Z9real_showIiEvRT_EEEvS3_EEEvS3_E12__FUNCTION__
0000000000401258 r _ZZ11show_commonIiXadL_Z9real_showIiEvRT_EEEvS2_E12__FUNCTION__
0000000000401240 r _ZZ11show_stringRSsE12__FUNCTION__
000000000040127a r _ZZ12show_common2IiXadL_Z9real_showIiEvRT_EEEvS2_E12__FUNCTION__
000000000040124c r _ZZ5printIiEvRT_E12__FUNCTION__
0000000000401252 r _ZZ5printISsEvRT_E12__FUNCTION__
0000000000401264 r _ZZ9real_showIiEvRT_E12__FUNCTION__
0000000000401288 r _ZZL18__gthread_active_pvE20__gthread_active_ptr
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值