扫一扫
分享文章到微信
扫一扫
关注官方公众号
至顶头条
我们先来看看C++中如何实现阶乘。
1)用函数实现阶乘:
int factorial(int n)
{
if (n == 0) return 1;
else return n * factorial(n-1);
}
void test()
{
printf(“4! = %d “, factorial(4));
}
2)用模板实现的阶乘:
template <int n> struct factorial
{
enum { result = n * factorial<n-1>::result };
};
template <> struct factorial<0>
{
enum { result = 1 };
};
void test()
{
printf(“4! = %d “, factorial<4>::result);
}
再来看看D语言中的阶乘。普通函数我们就不写了,这里列出D语言支持的两套模板语法:
1)和C/C++类似的模板文法:
template factorial(int n)
{
const factorial = n * factorial!(n-1);
}
template factorial(int n : 0)
{
const factorial = 1;
}
void test()
{
writefln(factorial!(4)); // prints 24
}
2)D语言引入的新型模板文法:
template factorial(int n)
{
static if (n == 0)
const factorial = 1;
else
const factorial = n * factorial!(n-1);
}
比较一下,我们不难理解,D语言对C++的模板文法主要做了以下2点改变:
1)将C++模板的<T>改为了!(T)。并将 factorial<n>::result 形式改为了 factorial!(n)。
2)引入了新的 static if 文法。
引起我注意的是改变2)。很明显,D语言在试图让写模板的人思维方法可以象写普通的函数那样进行。这是一个很有意义的尝试。我们设想一下,如果C++ Template也来支持 static if 文法:
template <int n> struct factorial
{
static if (n == 0)
enum { result = 1 };
else
enum { result = n * factorial<n-1>::result };
};
也许这会是一个不错的尝试。
如果您非常迫切的想了解IT领域最新产品与技术信息,那么订阅至顶网技术邮件将是您的最佳途径之一。
现场直击|2021世界人工智能大会
直击5G创新地带,就在2021MWC上海
5G已至 转型当时——服务提供商如何把握转型的绝佳时机
寻找自己的Flag
华为开发者大会2020(Cloud)- 科技行者