为什么我们需要C ++中的template关键字?

时间:2012-05-25 06:03:31

标签: c++ templates syntax language-lawyer

功能模板:

template<class T> T 
max(T a, T b){return (a > b)? a: b;}

使用时:

max<int>(a, b); // Yeah, the "<int>" is optional most of the time.

但如果允许,我们可以这样写模板:

T max<class T>(T a, T b){return (a > b)? a: b;} 
//I know the return type T is not in its scope, don't focus on that.

因此,我们可以保持相同的声明形式,并像正常函数一样使用。甚至不需要引入和键入关键字“模板”。我认为课堂模板会是一样的吗?那么还有其他原因使模板成为我们今天所知的形式吗?

我更改了表单,以便您不会专注于返回类型:

auto max<class T>(T a, T b) -> T {return (a > b)? a: b;}
//This is C++11 only and ugly i guess. 
//The type deduce happens at compile time 
//means that return type really didn't to be a problem.

4 个答案:

答案 0 :(得分:2)

我想到的直接答案是:
仅仅因为制定了模板提案的人这样说并且标准委员会中没有人认为输入那些额外的8字符会产生开销。

另一方面:
模板的语法起初很复杂且令人生畏,确保关键字template的存在使得它对代码的读者更直观,他们正在处理模板而不是C ++提供的任何其他动物或任何特定于实现的构造(读取编译器扩展)。

答案 1 :(得分:2)

您必须在使用之前声明T,因此必须

<class T> T max(T a, T b){return (a > b)? a: b;} 

但是不清楚<class T>是什么 - 编译器很可能会对它感到困惑。前面的template表明<不是运算符,而是包含类型声明的大括号。

从这个角度来看,你的第二个例子应该是可能的,但请记住,只有C ++ 11才能使用这种语法,并且很早就引入了模板。

答案 2 :(得分:1)

我相信问题依赖于编译器实现的简易性:C ++中使用的任何名称必须至少在用于帮助编译器从头开始解析之前声明(因为我不知道)。这就是你有一个奇怪的新语法来声明函数的一个原因,它允许在参数之后定义返回类型。

所以这里的原因是,在阅读你的例子时,T是第一个使用的名字,但它之前没有被声明,所以编译器不知道它是什么或它是什么样的表达式。

答案 3 :(得分:1)

你很快就会用这种方法解决问题:

template <typename> int f(); // Current declaration syntax, type template argument.
template <int> int f();      // Current declaration syntax, non-type template argument.

void f<class>(); // New declaration syntax, type argument. 
void f<int>(); // New declaration syntax, non-type argument.
(void) f<int>(); // (void) is a cast , f is instantiation of f<class> with type int.