3

一个函数模板:

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

4 回答 4

2

我想到的直接答案是:
仅仅因为提出模板提案的人这么说,而标准委员会中没有人认为输入这些额外的8字符会是一种开销。

另一方面:
模板的语法一开始就复杂且令人生畏,确保关键字的存在template使代码读者更直观地知道他们正在处理模板,而不是 C++ 提供的任何其他野兽或任何实现特定的构造(读取编译器扩展)。

于 2012-05-25T06:07:53.803 回答
2

你必须T在使用它之前声明它,所以它真的必须

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

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

从这个角度来看,您的第二个示例应该是可能的,但请记住,这种语法只能在 C++11 中使用,并且模板是在更早之前引入的。

于 2012-05-25T06:11:09.167 回答
1

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

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

于 2012-05-25T06:10:34.310 回答
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.
于 2012-05-25T07:28:15.717 回答