Для определения ваших функций вам потребуются частичные специализации для ваших функций, что недопустимо в C ++. Даже если это было законно, у вас нет параметров для вывода типа шаблона, поэтому вам всегда придется явно указывать аргументы шаблона:
std::vector<int> v = parseKeyValue<std::vector<int>>(...);
// ^ ^ ^
, поскольку вычет из присваивания переменной не являетсявозможно.
Если вы измените сигнатуру функции на заполнение параметра функции, вы можете работать с перегрузками:
template <typename T>
void parseKeyValue(T& t, std::istream& s);
template <typename T>
void parseKeyValue(std::vector<T>&, std::istream& s);
И у вас даже может быть вариант для универсальных контейнеров:
template <typename T, template <typename> class Container >
void parseKeyValue(Container<T>, std::istream& s);
Обратите внимание, что я изменил параметр с std::stringstream
на std::istream
, что является менее ограничительным, поэтому вы можете использовать функции, например, с std::cin
.
Таким образом, вы не будетеполагаться на частичные специализации и, кроме того, получить выгоду от вычета аргументов шаблона:
int n;
parseKeyValue(n, std::cin); // selects non-container overload
std::vector<int> v;
parseKeyValue(v, std::cin); // selects vector overload, as more specialised
std::list<int> l;
parseKeyValue(l, std::cin); // selects generic container overload
Примечание:
while(ss >> value){};
в исходной не векторной версии будет считывать любые доступные значения и будет отбрасывать все, кромеочень последнийЭто предназначено?