سؤال

سيسمح C++0x للقالب بأخذ عدد عشوائي من الوسائط.ما هو أفضل استخدام لهذه الميزة بخلاف تنفيذ الصفوف؟

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

المحلول

  1. طباعة آمنة من النوع f
  2. إعادة توجيه العديد من الحجج المنشئة التعسفية في طرق المصنع
  3. نأخذ اِعتِباطِيّ تسمح الفئات الأساسية بوضع وإزالة العناصر المفيدة سياسات.
  4. التهيئة بالتحرك كائنات مكتوبة غير متجانسة مباشرة في الحاوية من خلال وجود مُنشئ قالب متنوع.
  5. املك عامل حرفي يمكنها حساب قيمة حرفية يحددها المستخدم (مثل "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; }

انظر هذا الكود المثال: هنا

نصائح أخرى

وربما الحديث اندريه ألكسندريسكو على الذهاب الحدث 2012 الأصلية، وسوف تكون من اهتمامك:

هنا هو الفيديو و هنا الوثائق.

  • نوع آمن printf

والأشياء السماح مثل Boost.Function لاتخاذ أرقام عشوائية من المعلمات

ولقد كتب على كيفية تنفيذ واجهات COM متعددة والحفاظ على الشفرة المدمجة والأنيقة مع قوالب variadic C ++ 0X.

ولقد نفذت 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);

<القوي> تنويه : لأنا صاحب هذا مكتبة

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