从D语言看C++ Template语法

来源:互联网 发布:手机录音剪切软件 编辑:程序博客网 时间:2024/06/06 19:23

从D语言看C++ Template语法

许式伟 (版权声明)
2007-5-2

D语言是一门新兴的语言,它试图结合C/C++性能上的高效,同时又象Python、Ruby等“现代”语言那样具备高效的生产力。CSDN曾经对其做过专题报道。

我本人蛮喜欢D语言的语法,觉得当之无愧的简洁典雅。当然需要澄清的是,我不想让人误会,我不是要倡导“C/C++已死,请使用D语言”。本文也没有打算全面去讨论D语言。这里我只是把目光锁定在D语言的Template语法上。

我们先来看看C++中如何实现阶乘。

1)用函数实现阶乘:

int factorial(int n)
{
   
if (n == 0return 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)。并将 factorial::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 };
};

也许这会是一个不错的尝试。