typeid().name(); неправильный ввод

#c

#c

Вопрос:

Я пытаюсь получить выходной привет с переменной типа S для строки или Ss. Но я получаю какой-то другой длинный странный вывод. HelloNSt7__cxx1112basic_stringIcSt11char_traitsIcESaIcEEE

 #include <iostream>
#include <cmath>
#include <typeinfo>

using namespace std;

int main() {
    int var1 = 40;
    float var2 = 79.569;
    string var3 = "Hello";
  
    cout << var1 << typeid(var1).name() << endl;
    cout << var2 << typeid(var2).name() << endl; 
    cout << var3 << typeid(var3).name() << endl; 
  
    return 0;
}
 

Комментарии:

1. string является псевдонимом для того, что на самом деле вызывает реализация. Вы не можете ожидать какого-либо конкретного вывода в целом. Какую актуальную проблему вы пытаетесь решить?

Ответ №1:

std::type_info::name

Возвращает определенную реализацией символьную строку с нулевым завершением, содержащую имя типа. Никаких гарантий не дается; в частности, возвращаемая строка может быть идентичной для нескольких типов и меняться между вызовами одной и той же программы.

Вы не можете полагаться на name то, что on является чем-то конкретным.

Комментарии:

1. Как я мог бы напечатать тип для строки, такой как int и float .

2. @Pygatti если вы используете GCC, вы могли бы использовать abi::__cxa_demangle для демангуляции имени, возвращаемого std::type_info::name , хотя это дало бы вам std::basic_string<char, std::char_traits<char>> , которое является истинным именем std::string . Однако это очень зависит от реализации.

3. @Pygatti боюсь, ваш ответ, вероятно, в другом замке . Если вы расширите проблему, которая привела вас к typeinfo::name потенциальному решению в новом вопросе (невежливо менять вопрос после того, как на него был дан правильный ответ), возможно, мы сможем указать вам более удовлетворительное направление.

4. char const* type_str(std::type_info constamp; t) { if (t == typeid(std::string)) return "string"; if (t == typeid(int)) return "int"; /*...*/ return "unknown"; } и так далее для всех интересующих вас типов.