سؤال

هل من الممكن الحصول على اسم typename لمتغير عضو؟ علي سبيل المثال:

struct C { int value ; };

typedef typeof(C::value) type; // something like that?

شكرًا

هل كانت مفيدة؟

المحلول

ليس في C ++ 03. C ++ 0x يقدم decltype:

typedef decltype(C::value) type;

بعض المترجمين لديهم ملف typeof التمديد ، على الرغم من:

typedef typeof(C::value) type; // gcc

إذا كنت بخير مع Boost ، فلديهم ملف مكتبة لذلك:

typedef BOOST_TYPEOF(C::value) type;

نصائح أخرى

فقط إذا كنت بخير مع معالجة النوع في وظيفة

struct C { int value ; };

template<typename T, typename C>
void process(T C::*) {
  /* T is int */
}

int main() {
  process(&C::value); 
}

لن يعمل مع أعضاء البيانات المرجعية. سيسمح C ++ 0x decltype(C::value) للقيام بذلك بسهولة أكبر. ليس ذلك فحسب ، بل يسمح decltype(C::value + 5) وأي أشياء تعبير خيالية أخرى داخل decltype. GCC4.5 يدعمها بالفعل.

قد لا يكون بالضبط ما تبحث عنه ، ولكن من المحتمل أن يكون حلًا أفضل على المدى الطويل:

struct C {
  typedef int type;
  type value;
};

// now we can access the type of C::value as C::type
typedef C::type type;

هذا ليس بالضبط ما تريده ، لكنه يسمح لنا بإخفاء نوع التنفيذ من C::value حتى نتمكن من تغييره لاحقًا ، وهو ما أظن أنك بعده.

يعتمد ذلك على ما عليك فعله به ولكنك ستفعل شيئًا مثل:

#include <iostream>
using namespace std;

struct C
{
    typedef int VType;
    VType value;
};

int main()
{
    C::VType a = 3;
    cout << a << endl;
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top