Я бы хотел позвонить по телефону template<typename T> foo(T x)
и вручную обработать эти случаи: T = std::vector<U>
, T = std::string
, T =
любой другой случай.Шаблон специализации выпуск
Вот что я написал для этого:
#include <iostream>
#include <vector>
#include <string>
template<typename T> void foo_impl(const std::string &data, std::string *) {
std::cout << "foo for std::string called\n";
}
template<typename T> void foo_impl(const T &data, T *) {
std::cout << "foo for general types called\n";
}
template<typename T> void foo_impl(const std::vector<T> &data, std::vector<T> *) {
std::cout << "foo for std::vector<T> called\n";
}
template<typename T> void foo(const T &data) {
foo_impl(data, static_cast<T*>(nullptr));
}
int main() {
int i = 1;
foo(i);
std::vector<int> a = {0, 1};
foo(a);
std::string s = "abcd";
foo<std::string>(s);
return 0;
}
Однако foo(std::string x)
называется, как и в случае «T
любой другой тип». Как мне с этим справиться?
Имейте в виду, что 'станд :: VECTOR' имеет более одного параметра шаблона. –
Какова точка указателя-заглушки как второй аргумент? Ваши типы выводятся из первого аргумента. – SergeyA
@SergeyA для реального? Как насчет std :: vector? –
omtcyfz