2008-11-21 4 views
4

С вектором определяется как std::vector<std::string>, удивляясь, почему справедливо следующее:STL вопрос Вектор сравнения

if (vecMetaData[0] != "Some string") 
{ 
    ... 

Но не так:

switch (vecMetaData[1]) 
{ 
    ... 

Visual Studio жалуется:

ошибка C2450 : switch выражение типа 'std :: basic_string < _Elem, _Traits, _Ax>' является незаконным 1> с> [ 1> _Elem = символ, 1> _Traits = станд :: char_traits, 1> _Ax = станд :: Распределитель 1>] 1> Нет Оператор определенного пользователя преобразования доступно, который может выполнить это преобразование , или оператор не может называться

ответ

14

переключателя() необходим интегральный типа (например, INT, полукокс, ...)

строка не является не целочисленным типом, ни делает строка имеет неявное преобразование в интегральный тип, поэтому он не может быть используется в распределительном заявлении

2

Вы можете использовать переключатель только для базовых типов данных (int, char и т. д.).

3

Он действителен, потому что первый вызовет оператор! = Из std :: string, который примет аргумент const char *. Это, однако, не означает, что std :: string также имеет оператор some_integral_type(), который вернет интегральное выражение, которое необходимо для переключения.

Использование операторов в C++ не вызывает подозрение о встроенном значении. Например, ваш код не сравнивает значения указателя. Он может вызывать определенную пользователем (в данном случае, одну из std :: string) операторскую функцию.

1

Самый простой альтернативой BTW является std::map<std::string, boost::function> StringSwitch;

Это позволяет сказать StringSwitch["Some string"](arguments...)

1

Если вы просто хотите, чтобы проверить каждую вещь в векторе, вы могли бы использовать for_each стандарт библиотека функция. Или, если вы хотите действовать по подмножеству возможных значений, используйте find_if для получения итераторов для соответствующих элементов, а затем используйте цикл или for_each, чтобы действовать на них.

1

ни один из них, вероятно, вы так и не захотите ... поскольку я предполагаю, что вы хотите использовать функцию std :: string :: compare для сравнения строк

Смежные вопросы