Учитывая этот код:шаблон разрешения перегрузки Проблема
#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;
}
Как я могу специализироваться stringify()
для vector<>
после proxy<>
?
В настоящее время я получаю {?}{?}{?}
Если удалить этот один - stringify(const std::vector<T>& in)
то vector<int>
начинает получать называется потому, что это будет специализация первого.
Тогда я бы {?}INT vector specialization!{?}
Есть ли способ, чтобы вызвать любого из 2 вектора специализации stringification функций из proxy()
- если они определены в прошлом - после того, как функции proxy()
?
Есть ли способ частично специализироваться на vector<>
и до сих пор получить звонок от proxy<>
?
Я не хочу, чтобы специализироваться на vector<int>
, vector<double>
, vector<UserType>
...
EDIT: забыл упомянуть мне это нужно для C++98
спасибо большое! ты спас мою задницу!Мне нравится, когда работает C++ magic, и я этого не понимаю - все еще пытаюсь НЕ узнать о ADL :) жизнь коротка. – onqtam
@onqtam ADL очень важен - ведь это как 'std :: cout <<« Hello, World! »' Работает! – Barry
только что выяснил, что это не скомпилировано под VC++ 6 ... возможно, ADL сломан (только при использовании шаблонов для перегрузок! Бесполезные перегрузки функций в порядке) - он говорит в '' 'proxy()' '', что вызов является неоднозначным, если существует более 1 специализации. Может быть, его время отказаться от поддержки для него – onqtam