في لغة C++، هل يمكن أن يكون لديك دالة تقوم بتعديل مجموعة ذات طول متغير؟
سؤال
في 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 لاستدعاء دالة.