有没有人在实际编码中使用模版元编程?

luciferisnotsatan 2011-07-22 09:28:50
以下是个简单的阶乘列子
template <typename int n>
struct Factorial
{
enum {val = Factorial<n-1>::val * n};
};


template <>
struct Factorial<0>
{
enum {val = 1};
};


int x = Factorial<10>::val;

在编译时就把值算出来了。
00411E0E  mov         dword ptr [x],375F00h 


相当于把编译器看成函数式语言的解释器,但和函数式语言不同,元编程实在编译时计算的,用不到运行时上
int y=0;
cin>>y;
Factorial<y>::val;


有没有人在平时的工作(数学计算,编写STL模版库这类工作除外)中用到这个技术,编写这类代码?

看了C++模板元编程前两章,现在不清楚这东西能不能和直到运行时才能知道具体数据的程序结合使用?比如,由用户输入阶乘数,然后计算。
...全文
475 41 打赏 收藏 转发到动态 举报
写回复
用AI写文章
41 条回复
切换为时间正序
请发表友善的回复…
发表回复
Xcoder 2011-08-19
  • 打赏
  • 举报
回复
从我帖子的连接跳过来看到这个问题,举个例子,比如要对M*N矩阵求第K条对角线上元素的积,
如果写死, 其实就是
a11*a22*a33; a12*a23*a31 ... 这样的东西,

如果写个函数,大概是这样:
int product_k_line(int** a, int N, int M, int K) {
s=1;
for(i=0; i<N; ++i){
s*=a[i][(i+K)%M];
}
return s;
}
这个函数且不说循环变量,s初值,单是(i+K)%M 这个下标操作,就够费时的。

如果写模版,可以这样:
template<class T, int N, int M, int K>
class product_k_line{ public:
T operator()(T** a) {
return a[N-1][(N-1+K)%M] * product_k_line<T, N-1, M, K>()(a);
}
};
template<class T, int M, int K>
class product_k_line<T, 1, M, K> { public:
T operator()(T** a) {
return a[0][(0+K)%M];
}
};
这个模版经优化后生成的代码完全和写死是一样的!
而可以支持任意大小的矩阵,任意某条对角线!



unituniverse2 2011-07-23
  • 打赏
  • 举报
回复
[Quote=引用 39 楼 pamtry 的回复:]
虽然严格的讲说泛型编程是宏编程的发展不一定完全正确,不过在特性上我觉得还是很像的

至于模板元编程,毕竟不是模板的设计初衷,所以普及性肯定还是不够啊
[/Quote]
这类东西谈不上普及不普及,只是在“常规”方法无计可施的时候还有这类后备方案可选,而且有潜力能实现的非常好。
we_sky2008 2011-07-22
  • 打赏
  • 举报
回复
模板元编程,我觉得最大的缺点就是参数必须是编译期的常量
对于变量就无计可施了
decoupling 2011-07-22
  • 打赏
  • 举报
回复
如果楼主对template感兴趣..
推荐您看一下c++设计新思维: http://download.csdn.net/user/decoupling

不过如果和别人一起合作写程序.. 除非他们也和你一样对这东西感兴趣..否则还是不建议使用..
threeleafzerg007 2011-07-22
  • 打赏
  • 举报
回复
以前看过一段元编程代码,给任意一个数组名,计算出其维数,感觉很牛叉。


但是实际应用编程中,难寻元编程踪迹。
  • 打赏
  • 举报
回复
type_traits 常用,其他的不敢用啊。
lwanttowin 2011-07-22
  • 打赏
  • 举报
回复
封装类型的时候倒是经常会用到模板编程,比如单件模型之类的。但用来把类型代入数来计算就没用过了。不过编译的时候就能把值给算出来,这个倒是蛮提高运行效率的,好方法。
downmooner 2011-07-22
  • 打赏
  • 举报
回复
//获取数组元素个数
template<typename T,int n>
int sizeofx(T (&arr)[n])
{
return n;
}

//简单2进制
template<int n>
struct binaryx_
{
enum{value = n % 10 + binaryx_<n / 10>::value * 2};
};
template<>
struct binaryx_<0>
{
enum{value = 0};
};


很少用
Jxiaoshen 2011-07-22
  • 打赏
  • 举报
回复
分数沉重的帖子 用劲顶。。。
yuyan_linger 2011-07-22
  • 打赏
  • 举报
回复
帮顶

实际中用得多少 大概要看和你共事的人水平都怎么样了吧?
项目中总是要尽量写大家都能很容易理解的代码 所以这种东西出现的几率应该不高,也许很多十几年的编程经验的人都没接触过。 作为一种技巧,知道了对自己开阔视野和扩展思维都有好处。
nightkids_008 2011-07-22
  • 打赏
  • 举报
回复
表示没有用过。。。
独酌逸醉 2011-07-22
  • 打赏
  • 举报
回复
没有用过!
luciferisnotsatan 2011-07-22
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 loaden 的回复:]

买了一本模板元的书,不过,还没细看。
觉得用处不大。
[/Quote]
我也觉得对一半的程序用处不大。虽然能省去运行时的计算,但这个计算用到的数据得在编译时就知道。
cbib_cat 2011-07-22
  • 打赏
  • 举报
回复
没有用过,水平达不到!
机智的呆呆 2011-07-22
  • 打赏
  • 举报
回复
一般人用不了。能熟练使用的,水平真不是一般的高了。
昵称很不好取 2011-07-22
  • 打赏
  • 举报
回复
还没看这方面的东东,学习下
老邓 2011-07-22
  • 打赏
  • 举报
回复
买了一本模板元的书,不过,还没细看。
觉得用处不大。
pengzhixi 2011-07-22
  • 打赏
  • 举报
回复
zenny_chen
这个人用过。
至善者善之敌 2011-07-22
  • 打赏
  • 举报
回复
呵呵,高处不胜寒啊


记得谁说过,模板元是脑力过剩者玩的游戏!
luciferisnotsatan 2011-07-22
  • 打赏
  • 举报
回复
300分的帖子这么快沉了,就一人回复。。。。。。
加载更多回复(21)

64,685

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧