#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:
Возвращает определенную реализацией символьную строку с нулевым завершением, содержащую имя типа. Никаких гарантий не дается; в частности, возвращаемая строка может быть идентичной для нескольких типов и меняться между вызовами одной и той же программы.
Вы не можете полагаться на 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"; }
и так далее для всех интересующих вас типов.