C #: невозможно передать строку в Generic T, когда T is & ldquo; String & rdquo ;? [Дубликат]

Мне нравится следующее, потому что он помещает результаты в вектор, поддерживает строку как 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() отлично работает.

6
задан Viral Shah 8 August 2012 в 15:14
поделиться

4 ответа

Вам нужно перейти через object при кастеризации к родовому типу:

return (T)(object) v.ToString()

и

return (T)(object) v;

Я бы использовал is, а не ловил InvalidCastException.

Подробнее о том, почему это необходимо, см. в недавнем блоге Эрика Липперта .

В частности:

Поскольку компилятор знает, что единственный способ, которым это преобразование может быть успешным, - это U - bool, но U может быть чем угодно! Компилятор предполагает, что большую часть времени U не будет создан с bool, и поэтому этот код почти наверняка является ошибкой, и компилятор доводит этот факт до вашего сведения.

(Подставить T для U и string для bool ...)

25
ответ дан Jon Skeet 27 August 2018 в 16:45
поделиться

Вам нужно указать свою строку как object, так как ваш тип возврата является общим i.e.

return (T)(object)v.ToString();
2
ответ дан James 27 August 2018 в 16:45
поделиться
using System.ComponentModel;

...

public T Convert<T>(object v) {
    return (T)TypeDescriptor.GetConverter(typeof(T)).ConvertFrom(v);
}

Предупреждение, это вызовет исключение, если между T и объектом, содержащимся в v.

не существует никакого преобразования,
0
ответ дан Kevin 27 August 2018 в 16:45
поделиться

Попробуйте преобразовать в object перед преобразованием в T

return (T)(object)v; 
0
ответ дан Olivier Jacot-Descombes 27 August 2018 в 16:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: