为什么 C++ 标准不允许函数模板偏特化?
Why does the C++ standard not allow function template partial specialization?
我读到一些编译器编写起来可能会造成混淆的内容
template <class T>
void calculator<std::complex<T>>::myMin();
但也许只是像这样给它一个提示?说清楚是偏特化。
template < , class T>
void calculator<std::complex<T>>::myMin();
来自 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#229 在上面的评论中由 @danh 链接:
Notes from 10/00 meeting:
A major concern over the idea of partial specialization of function templates is that function templates can be overloaded, unlike class templates. Simply naming the function template in the specialization, as is done for class specialization, is not adequate to identify the template being specialized.
Why does the C++ standard not allow function template partial specialization?
因为,反过来想,如果标准允许模板函数部分特化会发生什么?
假设这个简单的例子假设标准允许模板函数的部分特化:
template<class T> void f( T ) { print("A-overload") };
template<class T> void f( T* ){ print("B-overload") };
// template<class T> void f(T*) { print("A-partial-specialization") };
你现在能区分 B 重载和 A 的部分特化吗?确实不行!
此外,假设您有另一个重载 T**
和来自重载-A 或重载-B 的偏特化,具有完全相同的签名,您会怎么做?
一般来说,偏特化的概念只存在于 class 模板(由 §14.5.5 描述)和成员模板(即模板 class 的成员本身就是模板函数,由 §14.5.5.3/2 描述)。它不存在于 class 模板的普通成员中,也不存在于函数模板中——仅仅因为它没有被标准描述。
我读到一些编译器编写起来可能会造成混淆的内容
template <class T>
void calculator<std::complex<T>>::myMin();
但也许只是像这样给它一个提示?说清楚是偏特化。
template < , class T>
void calculator<std::complex<T>>::myMin();
来自 http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_closed.html#229 在上面的评论中由 @danh 链接:
Notes from 10/00 meeting:
A major concern over the idea of partial specialization of function templates is that function templates can be overloaded, unlike class templates. Simply naming the function template in the specialization, as is done for class specialization, is not adequate to identify the template being specialized.
Why does the C++ standard not allow function template partial specialization?
因为,反过来想,如果标准允许模板函数部分特化会发生什么?
假设这个简单的例子假设标准允许模板函数的部分特化:
template<class T> void f( T ) { print("A-overload") };
template<class T> void f( T* ){ print("B-overload") };
// template<class T> void f(T*) { print("A-partial-specialization") };
你现在能区分 B 重载和 A 的部分特化吗?确实不行!
此外,假设您有另一个重载 T**
和来自重载-A 或重载-B 的偏特化,具有完全相同的签名,您会怎么做?
一般来说,偏特化的概念只存在于 class 模板(由 §14.5.5 描述)和成员模板(即模板 class 的成员本身就是模板函数,由 §14.5.5.3/2 描述)。它不存在于 class 模板的普通成员中,也不存在于函数模板中——仅仅因为它没有被标准描述。