AFAIK在C++ 0x中被更改。
我想這只是一個疏忽(考慮到你總是可以通過放置函數作爲類的一個static
成員來獲得部分專業化效果和更詳細的代碼)。
如果有相關DR(缺陷報告),您可以查看相關DR(缺陷報告)。
編輯:檢查這一點,我發現其他人也相信,但沒有人能夠在標準草案中找到任何此類支持。 This SO thread似乎表示函數模板的部分特化在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
}
對於'模板空隙F(T T,U U){}'也'模板<> void f(int t,char u){}'是允許的。 –
dashesy
2016-07-22 21:46:44
我覺得有趣的是,當問題不是「我怎麼能達到類似的目標」,而是「這種行爲背後的原因是什麼」時,人們總是提供解決方法......我自己不知道這個選擇的原因,但我認爲委員會必須有理由禁止功能模板部分專業化。到目前爲止,「最接近」的解釋是Georgy發佈的鏈接,該鏈接僅指出存在過載時功能模板部分專業化的潛在「風險」。但是,我不認爲這是禁止此功能的理由,所以我認爲還有更多這樣的內容。 – bartgol 2017-10-03 19:58:39