TextID () إرجاع أحرف إضافية في G ++
-
16-09-2019 - |
سؤال
class foo
{
public:
void say_type_name()
{
std::cout << typeid(this).name() << std::endl;
}
};
int main()
{
foo f;;
f.say_type_name();
}
فوق رمز المطبوعات P3FOO. على جهاز Ubuntu الخاص بي مع G ++. أنا لا أتلقى لماذا هو الطباعة P3FOO. بدلا من مجرد فور. وبعد إذا قمت بتغيير الرمز مثل
std::cout << typeid(*this).name() << std::endl;
يطبع 3foo..
أي أفكار؟
المحلول
لأنه مؤشر إلى فو. و foo لديه 3 أحرف. لذلك يصبح P3foo
. وبعد الآخر لديه نوع foo
, ، لذلك يصبح 3foo
. وبعد لاحظ أن النص يعتمد على التنفيذ، وفي هذه الحالة يمنحك دول مجلس التعاون الخليجي الاسم الداخلي والمظلات.
أدخل اسم النفايات في البرنامج c++filt
للحصول على اسم غير مشترك:
$ c++filt -t P3foo
foo*
نصائح أخرى
std::type_info::name()
إرجاع اسم محدد التنفيذ. AFAIK، لا توجد طريقة محمولة للحصول على اسم "لطيف"، على الرغم من دول مجلس التعاون الخليجي لديه واحد. وبعد ينظر الى abi::__cxa_demangle()
.
int status;
char *realname = abi::__cxa_demangle(typeid(obj).name(), 0, 0, &status);
std::cout << realname;
free(realname);
هل هناك حل محمول
سيكون الحل البديل هو جعل القالب الاختراق لإرجاع جميع أسماء أنواع Harcoded كما char*
أي منصة لا تملك #include <cxxabi.h>
?