Мне нравится следующее, потому что он помещает результаты в вектор, поддерживает строку как delim и дает контроль над сохранением пустых значений. Но это выглядит не так хорошо.
#include
#include
#include
#include
#include
using namespace std;
vector split(const string& s, const string& delim, const bool keep_empty = true) {
vector result;
if (delim.empty()) {
result.push_back(s);
return result;
}
string::const_iterator substart = s.begin(), subend;
while (true) {
subend = search(substart, s.end(), delim.begin(), delim.end());
string temp(substart, subend);
if (keep_empty || !temp.empty()) {
result.push_back(temp);
}
if (subend == s.end()) {
break;
}
substart = subend + delim.size();
}
return result;
}
int main() {
const vector words = split("So close no matter how far", " ");
copy(words.begin(), words.end(), ostream_iterator(cout, "\n"));
}
Конечно, Boost имеет split()
, который работает частично так. И, если по «белому пространству» вы действительно имеете в виду любой тип белого пространства, использование разделения Boost с is_any_of()
отлично работает.
Вам нужно перейти через object
при кастеризации к родовому типу:
return (T)(object) v.ToString()
и
return (T)(object) v;
Я бы использовал is
, а не ловил InvalidCastException
.
Подробнее о том, почему это необходимо, см. в недавнем блоге Эрика Липперта .
В частности:
Поскольку компилятор знает, что единственный способ, которым это преобразование может быть успешным, - это
blockquote >U
- bool, ноU
может быть чем угодно! Компилятор предполагает, что большую часть времениU
не будет создан сbool
, и поэтому этот код почти наверняка является ошибкой, и компилятор доводит этот факт до вашего сведения.(Подставить
T
дляU
иstring
дляbool
...)
Вам нужно указать свою строку как object
, так как ваш тип возврата является общим i.e.
return (T)(object)v.ToString();
using System.ComponentModel;
...
public T Convert<T>(object v) {
return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}
Предупреждение, это вызовет исключение, если между T и объектом, содержащимся в v.
не существует никакого преобразования, Попробуйте преобразовать в object
перед преобразованием в T
return (T)(object)v;