Я читаю значения одиночной точности с разделителями пробелов в научной нотации из файла ASCII. В строке есть несколько значений. Я заполняю вектор через поток; примитивный тип вектора может отличаться от типа данных:Вставка из строкового потока с преобразованием импликации
// Illustrates typical string from file
std::string string_with_floats("-2.750000e+001 2.750000e+001 3.450000e+001");
// Template parameter is the desired return type
vector<int> data = ReadValues<int>(string_with_floats);
template <class T>
vector<T>& ReadValues(std::string& string_with_data)
{
std::stringstream ss(string_with_data);
std::vector<T> values;
T val;
while(stream >> val)
{
values.push_back(val);
}
return values;
}
В приведенном выше примере результатов в векторе заселяется только с первым значением, усекается до -2, предположительно из-за цикл завершается, как только встречается нечисловой символ. Он работает так, как ожидалось, когда входящая строка содержит значения int, даже если параметр шаблона является float.
Есть ли способ настроить stringstream для выполнения неявного преобразования и округления до ближайшего целого числа, или мне нужно сначала вставить исходный примитивный тип (float) и выполнить явное преобразование в T? В идеале, я бы не хотел рассказывать ReadValues о типе данных в string_with_data - он всегда будет одним из double, float, int, short или long, а запрошенный тип также может быть любым из этих типов.
Спасибо.
Спасибо. Я сделал первый подход, который вы предлагаете в конце, указав тип, исходящий из параметра шаблона. Я заменил C-стиль на static_cast (val). –
pdm2011