سؤال

أحاول القيام بنوع من "التحميل الزائد" للماكرو، بحيث يتم توسيع MACRO (شيء ما) بشكل مختلف عن MACRO (شيء ما، آخر).

باستخدام مقتطف حصلت عليه من هنا (لست متأكدًا مما إذا كان محمولًا بنسبة 100٪) وبعض الوظائف من Boost PP Library، تمكنت من إنجاحها:D

//THESE TWO COUNT THE NUMBER OF ARGUMENTS
#define VA_NARGS_IMPL(_1, _2, _3, _4, _5, N, ...) N
#define VA_NARGS(...) VA_NARGS_IMPL(__VA_ARGS__, 5, 4, 3, 2, 1)

//THIS ONE RETURNS THE PARAMETER AT POSITION _i FROM A LIST OF __VA_ARGS__
#define VA_ARG(_i, ...) BOOST_PP_ARRAY_ELEM(_i, (VA_NARGS(__VA_ARGS__), (__VA_ARGS__)))

//AND THIS ONE IS THE 'OVERLOADED' MACRO ;)
#define TEST(...) BOOST_PP_IF(BOOST_PP_EQUAL(1, VA_NARGS(__VA_ARGS__)), function_A(VA_ARG(0, __VA_ARGS__)), \ //1 parameter
                  BOOST_PP_IF(BOOST_PP_EQUAL(2, VA_NARGS(__VA_ARGS__)), function_B(VA_ARG(0, __VA_ARGS__) + VA_ARG(1, __VA_ARGS__)), \ //2 parameters
                  BOOST_PP_IF(BOOST_PP_EQUAL(3, VA_NARGS(__VA_ARGS__)), function_C(VA_ARG(1, __VA_ARGS__) + VA_ARG(2, __VA_ARGS__)), BOOST_PP_EMPTY())) // 3 parameters and so on ...

So       TEST(a) = function_A(a)
      TEST(a, b) = function_B(a + b)
   TEST(a, b, c) = function_C(b + c)

الآن ما زلت أفتقد شيئين آخرين أريد القيام بهما:

  1. (هذه المشكلة لا أهتم بها حقًا إذا لم أحلها مطلقًا) أعتقد أنه يمكن كتابة MACRO أنه عند تناول عدد "المتغيرات" و"الإخراج" المقابل لها، يُنشئ رمزًا مشابهًا لذلك الموجود أعلاه.شيء مثل TEMPLATE(3, function_A(...), function_B(...), function_C(...)) لإنشاء المثال أعلاه.

  2. ماذا يحدث عندما يتم استدعاء TEST() بدون وسيطات؟حسنًا، يتسع VA_NARGS إلى 1.لكن الحجة الأولى هي ""(لا شيء).أحاول إيجاد طريقة لاكتشاف الوسائط "الصفرية". __VA_ARGS__ أو للتمييز بين الوسيطة "الخالية" والوسيطة الحقيقية، من أجل توسيع وظيفة "التحميل الزائد" للرد على هذا الموقف.أيه أفكار؟

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

المحلول

للإجابة على سؤالك 2 أولا.نعم، باستخدام وحدات الماكرو المتغيرة، من الممكن أيضًا اكتشاف قائمة وسائط فارغة.الشرح طويل بعض الشيء، لقد كتبته هنا.يجب أن يكون من السهل نسبيًا دمج هذا الأسلوب مع وحدات الماكرو المعززة التي تستخدمها.

بالنسبة لسؤالك 1، نعم هذا ممكن أيضًا.أعتقد أن Boost يحتوي على بعض وحدات الماكرو التكرارية التي تقترب من هذا، لكنها تبدو مخيفة بعض الشيء عند استخدامها.إذا فهمت بشكل صحيح عليك استخدام شيء مثل القوائم المتداخلة (a, (b, (c,d))), ، ليست مريحة للغاية.

(كتبت مجموعة من وحدات الماكرو التي يمكنها تحقيق ذلك بشكل مباشر ، لكن للأسف ، لم تكن الحزمة جاهزة بعد للإصدار.تواصل معي على الخاص اذا كنت كذلك حقًا مهتمة به.)

يحرر: ال ص99 يتم نشر الحزمة في هذه الأثناء وتحتوي على الكثير من الأشياء فوق "التحميل الزائد" للماكرو واكتب وحدات ماكرو عامة.

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