سؤال

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>?

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top