鑑於此代碼:模板重載麻煩
#include <string>
#include <vector>
#include <iostream>
template <typename T>
std::string stringify(const T&) {
return "{?}";
}
template <typename T>
std::string proxy(const T& in) {
return stringify(in);
}
// trying to specialize "stringify()"
template <typename T>
std::string stringify(const std::vector<T>& in) {
return "vector specialization!";
}
template <>
std::string stringify(const std::vector<int>& in) {
return "INT vector specialization!";
}
int main() {
std::cout << proxy(1); // calls the 1st
std::vector<int> intVec;
std::cout << proxy(intVec); // calls the 1st
std::vector<double> dblVec;
std::cout << proxy(dblVec); // calls the 1st
return 0;
}
我怎樣才能proxy<>
後專門爲stringify()
vector<>
?
目前我得到{?}{?}{?}
如果我刪除這一個 - stringify(const std::vector<T>& in)
那麼vector<int>
開始變得調用,因爲這將是第一的專業化。
然後我會得到{?}INT vector specialization!{?}
有什麼辦法調用任何的2矢量專業化字串功能從proxy()
- 如果它們被定義最後 - 在proxy()
功能之後?
有沒有辦法部分專注於vector<>
並仍然從proxy<>
打電話?
我不想專門爲vector<int>
,vector<double>
,vector<UserType>
...
編輯:忘了提我需要這個C++98
非常感謝!你救了我的屁股!我喜歡它,當C++魔術工作,我不明白它 - 仍然試圖不學習ADL :)生命是短暫的。 – onqtam
@onqtam ADL是非常重要的 - 畢竟它是如何'標準:: cout <<「你好,世界!」'工作! – Barry
剛剛發現,這不能在VC++ 6下編譯...也許ADL是壞的(只有當使用模板重載!免費函數重載罰款) - 它說在'''代理()'''如果有超過1個專業化,該調用是不明確的。也許是時候放棄對它的支持 – onqtam