في لغة C++، هل يمكن أن يكون لديك دالة تقوم بتعديل مجموعة ذات طول متغير؟

StackOverflow https://stackoverflow.com/questions/80348

  •  09-06-2019
  •  | 
  •  

سؤال

في C++0x أود أن أكتب دالة مثل هذا:

template <typename... Types>
void fun(typename std::tuple<Types...> my_tuple) {
    //Put things into the tuple
}

لقد حاولت أولاً استخدام حلقة for int i ثم قم بما يلي:

get<i>(my_tuple);

ثم قم بتخزين بعض القيمة في النتيجة.لكن، get يعمل فقط على constexpr.

إذا كان بإمكاني إخراج المتغيرات من tuple وتمريرها إلى دالة قالبية متنوعة يمكنني تكرارها عبر الوسيطات بسهولة شديدة، لكن ليس لدي أي فكرة عن كيفية إخراج المتغيرات من المجموعة بدونها get.أي أفكار حول كيفية القيام بذلك؟أو هل لدى أي شخص طريقة أخرى لتعديل هذا tuple?

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

المحلول

منذ "أنا" في

get<i>(tup)

يجب أن يكون ثابتًا في وقت الترجمة، ويتم استخدام إنشاء مثيل للقالب "للتكرار" (في الواقع التكرار) من خلال القيم.تحتوي مجموعات Boost على الوظائف الوصفية "الطول" و"العنصر" التي يمكن أن تكون مفيدة هنا - أفترض أن C++0x يحتوي على هذه الوظائف أيضًا.

نصائح أخرى

Boost.Fusion يستحق نظرة.يمكن أن "يتكرر" أكثر std::pair, boost::tuple, وبعض الحاويات الأخرى وأنواع الصفوف الخاصة بها، على الرغم من أنني لا أعتقد أنها تدعمها std::tuple حتى الآن.

AFAICT، تحتاج صفوف C++ أساسًا إلى التعامل معها من خلال التكرار؛لا يبدو أن هناك أي طرق حقيقية لتعبئة/تفريغ الصفوف يستثني باستخدام معالجة القالب المتغير الوحيد لنظام الكتابة.

ألقِ نظرة على القسم 6.1.3.4 من TR1، http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2005/n1836.pdf

يتم تعريف get لكل من الصفوف المؤهلة const وغير const وإرجاع نوع المرجع المناسب.إذا قمت بتغيير إعلان وظيفتك إلى ما يلي:

template 
void fun(typename std::tuple& my_tuple) {
    //Put things into the tuple
}

بعد ذلك تكون الوسيطة الخاصة بوظيفتك عبارة عن صف غير ثابت وسيسمح لك get بإجراء التعيينات اللازمة بمجرد كتابة التكرار باستخدام المعلومات المقدمة في الردود السابقة.

ألقِ نظرة على إجابتي هنا للحصول على مثال لتكرار القالب لتفكيك وسيطات tuple لاستدعاء دالة.

كيف أقوم بتوسيع الصف إلى وسيطات وظيفة القالب المتغير؟

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