默认模板参数:为什么仅限于类模板?
在 C 中,默认模板参数仅允许用于类模板。此限制提出了为什么不能为成员函数模板定义此类参数的问题。
考虑以下示例:
<code class="cpp">struct my_class { template<class T = int> void mymember(T* vec) { // ... } };</code>
在此示例中,尝试定义默认类型用于成员函数模板内的模板参数 T,但 C 不允许此语法。相反,默认模板参数严格限于类模板。
限制背后的原因
禁止函数模板使用默认模板参数源于历史原因。在 C 的早期版本中,独立函数并未完全集成到该语言的模板系统中。为了鼓励使用被认为更惯用的成员函数模板,默认模板参数被限制为类模板。
但是,此限制后来被认为是一种限制,因为它不必要地区分成员函数模板和独立的功能模板。正如 Bjarne Stroustrup 在缺陷报告中指出的那样:
“禁止函数模板使用默认模板参数是一个错误的残余......[它]不必要地使独立函数与成员函数不同,从而严重限制了编程风格."
C 0x 更新
为了回应这些问题,C 0x 为独立函数模板引入了默认模板参数。此更改允许模板编程更加灵活和一致。
示例
考虑以下 C 0x 代码:
<code class="cpp">template<typename Iterator, typename Comp = std::less< typename std::iterator_traits<Iterator>::value_type>> void sort(Iterator beg, Iterator end, Comp c = Comp()) { ... }</code>
在此示例中,为 Comp 模板参数指定了一个默认模板实参,允许排序算法默认使用标准的 less 比较函数。
以上是为什么默认模板参数不能用于 C 中的成员函数模板?的详细内容。更多信息请关注PHP中文网其他相关文章!