سؤال
سيسمح C++0x للقالب بأخذ عدد عشوائي من الوسائط.ما هو أفضل استخدام لهذه الميزة بخلاف تنفيذ الصفوف؟
المحلول
- طباعة آمنة من النوع f
- إعادة توجيه العديد من الحجج المنشئة التعسفية في طرق المصنع
- نأخذ اِعتِباطِيّ تسمح الفئات الأساسية بوضع وإزالة العناصر المفيدة سياسات.
- التهيئة بالتحرك كائنات مكتوبة غير متجانسة مباشرة في الحاوية من خلال وجود مُنشئ قالب متنوع.
- املك عامل حرفي يمكنها حساب قيمة حرفية يحددها المستخدم (مثل "10110b").
عينة إلى 3:
template<typename... T> struct flexible : T... { flexible(): T()... { } };
عينة إلى 4:
struct my_container { template<typename... T> my_container(T&&... t) { } };
my_container c = { a, b, c };
عينة إلى 5:
template<char... digits>
int operator "" b() { return convert<digits...>::value; }
انظر هذا الكود المثال: هنا
نصائح أخرى
- نوع آمن
printf
والأشياء السماح مثل Boost.Function لاتخاذ أرقام عشوائية من المعلمات
ولقد نفذت NDArray (مجموعة N-dimentional) ولها setSizes الأسلوب مع عدد variadic من الحجج. باستخدام الحجج قالب variadic هو نوع أكثر أمانا من استخدام الحجج وظيفة variadic، علاوة على ذلك أستطيع السيطرة على عدد من المعلمات التي تم تمريرها إلى هذه الوظيفة في وقت الترجمة فقط مع الحجج قالب variadic.
void setSizes(uintmax_t currentSize) {
static_assert(1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
}
template <typename... Sizes>
void setSizes(uintmax_t currentSize, Sizes... sizes) {
static_assert(sizeof...(Sizes) + 1 == NDimensions, "Invalid count of arguments given to setSizes.");
size_ = currentSize;
data_ = new NDArrayReferenceType[currentSize];
for (uintmax_t i = 0; i < currentSize; i++) {
data_[i]->setSizes(sizes...);
}
}
ولقد نفذت أيضا مجمع منشئ عالمي لبلدي عصامي مؤشر ذكي. فإنه يلتف على كل منشئ المعرفة من نوع مؤشر الخام.
template <typename TSmartPointer, typename... Args>
static inline void initialize(TSmartPointer *smartPointer, Args... args) {
smartPointer->pointer_ = new typename TSmartPointer::PointerType(std::forward<Args>(args)...);
smartPointer->__retain();
}
وهذا الرمز يبدو أن inobvious، وهذا هو جزء من مهيئ للمؤشر ذكي لحالة ما إذا كان مؤشر ذكي يجب استدعاء منشئ مؤشر تلقائيا في الاستحواذ على مؤشر ذكي (RAII). في حالة فئات مجردة أنه غير قادر على استدعاء المنشئ.
وهكذا، إذا كان لدي نوع AbstractObject، وهو مؤشر ذكي من فئة مجردة، ونوع ConcreteObject، وهو مؤشر ذكي من فئة مع منشئ التي تأخذ اثنين [إينتس]، أستطيع أن أكتب البرمجية التالية:
AbstractObject object = ConcreteObject(42, 42);
وهو مثل C # و Java (ولكن مع RAII) وبالنسبة لي كان يعمل في C ++ / مجلس التعاون الخليجي 4.8 =)
ونوع سلامة كل مكالمة مع عدد حجة الحيوية.
واكتب آمنة وقد ورد ذكر printf في إجابات أخرى، ولكن بشكل عام القوالب variadic يمكن استخدامها لتنفيذ مهام التنسيق التي لا تحتاج إلى تمرير معلومات نوع عبر محددات الشكل على الإطلاق. على سبيل المثال، C ++ مكتبة تنسيق تنفذ مهام التنسيق مماثلة إلى <لأ href = بايثون "HTTPS: // مستندات .python.org / 2 / مكتبة / stdtypes.html # str.format "يختلط =" نوفولو "> str.format :
fmt::print("I'd rather be {1} than {0}.", "right", "happy");
وبالإضافة إلى printf آمن. أنواع الحجج قبض عليهم وهم تلقائيا باستخدام قوالب variadic في C ++ (11).
وهذا يجعل المتخصصين printf مثل lld
أو PRIdPTR
سيئة السمعة لا لزوم لها، وبدلا من
std::printf("Local number: %" PRIdPTR "\n\n", someIntPtr);
ويمكن للمرء ببساطة استخدام
fmt::printf("Local number: %d\n\n", someIntPtr);
<القوي> تنويه : لأنا صاحب هذا مكتبة