[c++] متى ستستخدم النموذج التوضيحي الصريح؟



Answers

تم تصميم إنستياتيون الصريح لتحسين استخدام مكتبات القالب التي توفر بعض مثيلات القالب (المستخدمة في الغالب) في النموذج الثنائي المترجم بدلا من نموذج التعليمات البرمجية المصدر. وسيؤدي ذلك إلى تقليل وقت تجميع وربط تطبيقات المستعمل النهائي. على سبيل المثال std::basic_string<char> و std::basic_string<wchar_t> يمكن أن تكون مثبتة صراحة في توزيع المحكمة الخاصة بلبنان تجنب العمل على إنشائها في كل وحدة الترجمة.

إن التفعيل الصريح مفيد أيضا عندما تريد تغليف تطبيق القالب وتريد استخدام هذا القالب فقط مع مجموعة معروفة من الأنواع. في هذه الحالة يمكنك وضع إعلانات وظائف القالب فقط (مجانا أو أعضاء) في ملف الرأس ( .h/.hpp ) وتعريفها في وحدة الترجمة ( .cpp ).

مثال:

 // numeric_vector.h
 //////////////////////////////////////////////////
 template <typename T> class numeric_vector
 {
    ...
    void sort();
 };


 // numeric_vector.cpp
 //////////////////////////////////////////////////
 // We know that it shall be used with doubles and ints only,
 // so we explicitly instantiate it for doubles and ints
 template class numeric_vector<int>;
 template class numeric_vector<double>;

 // Note that you could instantiate only specific
 // members you need (functions and static data), not entire class:
 template void numeric_vector<float>::sort();

 template <typename T> void numeric_vector<T>::sort()
 {
   // Implementation
   ...
 }

كما يمكن أن يكون مثيل الصريح مفيدا عندما تحتاج نوع مثبت من قالب ولكن داخل بناء بعض بناء الجملة التي لا تؤدي إينياتياتيون نفسها، على سبيل المثال بعض ميتا ميزة محددة المترجم مثل __declspec(uuid) في فيسوال ستوديو .

لاحظ الفرق مع تقنية أخرى يمكن استخدامها للتغليف التنفيذ - التخصص صريح. مع التخصص الصريح يجب تقديم تعريف محدد لكل نوع لتكون متخصصة. مع مثيل صريح لديك تعريف قالب واحد.

النظر في نفس المثال مع التخصص الصريح:

مثال:

 // numeric_vector.h
 //////////////////////////////////////////////////
 template <typename T> class numeric_vector
 {
    ...
    void sort();
 };

 template <> class numeric_vector<int>
 {
    ...
    void sort();
 };

 template <> class numeric_vector<double>
 {
    ...
    void sort();
 };

 // Specializing separate members is also allowed
 template <> void numeric_vector<float>::sort();

 // numeric_vector.cpp    
 //////////////////////////////////////////////////
 void numeric_vector<int>::sort()
 {
   // Implementation for int
   ...
 }

 void numeric_vector<double>::sort()
 {
   // Implementation for double
   ...
 }

 void numeric_vector<float>::sort()
 {
   // Implementation for float       
   ...
 }
Question

لقد قرأت للتو عن النموذج التوضيحي الصريح:

template struct MyStruct<long>;

ووصفت بأنها "نادرة جدا"، لذلك تحت أي ظروف سيكون من المفيد؟




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




Links