оператор if для разных typeid - PullRequest
1 голос
/ 22 апреля 2020

В настоящее время я работаю над кодом и пытаюсь использовать оператор if для переменной, которая была взята из файла .txt со строкой c. Он должен выглядеть как

if (a.variable == "string") {}

Когда я использую

std::cout << a.variable << std::endl;
std::cout << "string" << std::endl;

, я получаю те же результаты, но при использовании

std::cout << typeid(a.variable).name() << std::endl;
std::cout << typeid("string").name() << std::endl;

я получаю разные результаты:

NSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

и

A5_ c.

Может ли это быть причиной сбоя оператора if? Если я не ошибаюсь, первый typeid обозначает базовую строку c. Я благодарен за любой ввод!

Код, который я использую для чтения, выглядит так:

std::string::size_type beginoption = section.find("=",position); 
beginoption = beginoption +1; 
std::string::size_type endoption = section.find("\n",position); 
optionstorage = section.substr(beginoption, endoption - beginoption); 

Ответы [ 2 ]

2 голосов
/ 22 апреля 2020

Два объекта в C ++ не обязательно должны быть одинакового типа, чтобы сравнивать их как равные. Вы можете сравнивать строковые объекты со строковыми литералами, поскольку существует перегрузка operator==, которая принимает аргументы std::string и char const *. (Оператор typeid() возвращает другое значение, потому что два выражения имеют разные типы; одно - строковый объект, а другое - массив символов, но вы действительно можете сравнить их.)

Вы упомянули, что ваше "if утверждение не выполняется", но когда вы проверяете содержимое строк, они кажутся одинаковыми - на самом деле они могут , а не совпадать. Например, в вашем коде, если a.variable имеет завершающий пробел, вы бы не увидели бы это в выводе, и все же строки также не были бы равны.

Попробуйте написать обе строки в окружении некоторыми персонажами. Я подозреваю, что вы увидите, что где-то есть лишние пробелы:

std::cout << '[' << a.variable << ']' << std::endl;
std::cout << '[' << "string" << ']' << std::endl;

Также рассмотрите возможность отображения a.variable.size(). Если это не 6, то две строки не могут быть равны, так как они имеют разную длину.

0 голосов
/ 22 апреля 2020

Для целей typeid, a.variable имеет тип std::string, а строковый литерал "string" имеет тип char const [7].

, который объясняет вывод

std::cout << typeid(a.variable).name() << std::endl;
std::cout << typeid("string").name() << std::endl;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...