为什么函数模板不能部分专用?
我知道语言规范禁止function模板的部分专业化。
我想知道为什么禁止它的理由? 他们没用吗?
template<typename T, typename U> void f() {} //allowed! template<> void f<int, char>() {} //allowed! template<typename T> void f<char, T>() {} //not allowed! template<typename T> void f<T, int>() {} //not allowed!
在C ++ 0x中更改了AFAIK。
我想这只是一个疏忽(考虑到你可以总是通过放置函数作为一个类的static
成员获得部分专业化效果与更详细的代码)。
如果有相关的DR(缺陷报告),你可以查看相关的DR(缺陷报告)。
编辑 :检查这一点,我发现其他人也相信,但没有人能够在标准草案中find任何这样的支持。 这个SO线程似乎表明在C ++ 0x中不支持函数模板的部分特化 。
编辑2 :只是我的意思是“作为一个类的static
成员放置函数”的一个例子:
#include <iostream> using namespace std; // template<typename T, typename U> void f() {} //allowed! // template<> void f<int, char>() {} //allowed! // template<typename T> void f<char, T>() {} //not allowed! // template<typename T> void f<T, int>() {} //not allowed! void say( char const s[] ) { std::cout << s << std::endl; } namespace detail { template< class T, class U > struct F { static void impl() { say( "1. primary template" ); } }; template<> struct F<int, char> { static void impl() { say( "2. <int, char> explicit specialization" ); } }; template< class T > struct F< char, T > { static void impl() { say( "3. <char, T> partial specialization" ); } }; template< class T > struct F< T, int > { static void impl() { say( "4. <T, int> partial specialization" ); } }; } // namespace detail template< class T, class U > void f() { detail::F<T, U>::impl(); } int main() { f<char const*, double>(); // 1 f<int, char>(); // 2 f<char, double>(); // 3 f<double, int>(); // 4 }
一般来说,不build议专门化function模板,因为过载的问题。 这是一篇来自C / C ++用户日志的好文章: http : //www.gotw.ca/publications/mill17.htm
它包含一个诚实的回答你的问题:
一方面,你不能部分地专注于他们 – 几乎只是因为语言说你不能。
那么,你真的不能做部分function/方法专精,但是你可以重载。
template <typename T, typename U> T fun(U pObj){...} // acts like partial specialization <T, int> AFAIK // (based on Modern C++ Design by Alexandrescu) template <typename T> T fun(int pObj){...}
这是方式,但我不知道它是否让你满意。
既然你可以部分专门化类,你可以使用一个仿函数:
#include <iostream> template < typename dtype , int k > struct fun { int operator()() { return k ; } } ; template < typename dtype > struct fun < dtype , 0 > { int operator()() { return 42 ; } } ; int main ( int argc , char * argv[] ) { std::cout << fun<float,5>()() << std::endl ; std::cout << fun<float,0>()() << std::endl ; }