五千年(敝帚自珍)

主题:庆祝Python跃居世界第四程序语言 -- 空格

共:💬100 🌺284
全看分页树展 · 主题 跟帖
家园 可以

但必须引入template.

因为C++是一种强类型语言,重载一般是指1)参数的个数不同或者2)参数的类型不同.

此例如果0与n类型一样,不满足的以上重载适用的条件。 但是1)引入模板可以使得整数(integral)可以变成类型(type),2)对圆括号()运算符重载可以使类(class)变成函数。

所以可以这样:

template<int n> struct f

{

size_t operator()()

{

return f<n-1>()*n;

}

};

template<> struct f<0>

{

size_t operator()()

{

return 1;

}

};

这么使用:

assert(f<0>() == 1);

assert(f<1>() == 1);

assert(f<2>() == 2);

assert(f<3>() == 6);

虽然形式上有点差异(有尖括号,而且参数在尖括号里),但思想本质上是一致的:即根据数值而不是类型重载,不知这是不是你想要的效果。

全看分页树展 · 主题 跟帖


有趣有益,互惠互利;开阔视野,博采众长。
虚拟的网络,真实的人。天南地北客,相逢皆朋友

Copyright © cchere 西西河