std::function
هو كائن محو النوع. هذا يعني أنه يمحو تفاصيل كيفية حدوث بعض العمليات ، ويوفر واجهة وقت تشغيل موحدة لهم. إلى عن على std::function
, ، الابتدائي1 العمليات هي النسخ/الحركة ، والتدمير ، و "الاحتجاج" مع operator()
- "وظيفة مثل مشغل المكالمات".
في اللغة الإنجليزية الأقل هزيمة ، هذا يعني ذلك std::function
يمكن أن تحتوي على أي كائن تقريبًا يعمل مثل مؤشر الوظيفة في كيفية تسميته.
يذهب التوقيع الذي يدعمه داخل أقواس الزاوية: std::function<void()>
يأخذ الصفر الحجج ولا يعيد شيئًا. std::function< double( int, int ) >
يأخذ اثنين int
الحجج والعودة double
. على العموم، std::function
يدعم تخزين أي كائن يشبه الوظيفة يمكن تحويل وسيطه من قائمة الوسيطة الخاصة به ، ويمكن تحويل قيمة الإرجاع إلى قيمة الإرجاع الخاصة به.
من المهم معرفة ذلك std::function
و Lambdas مختلفة ، إذا كانت متوافقة ، الوحوش.
الجزء التالي من الخط هو لامدا. هذا بناء جملة جديد في C ++ 11 لإضافة القدرة على كتابة كائنات بسيطة تشبه الوظائف-الكائنات التي يمكن التذرع بها ()
. يمكن محو هذه الكائنات وتخزينها في أ std::function
على حساب بعض وقت التشغيل النفقات العامة.
[](){ code }
على وجه الخصوص هو لامدا بسيط حقا. وهو يتوافق مع هذا:
struct some_anonymous_type {
some_anonymous_type() {}
void operator()const{
code
}
};
مثيل لنوع الوظيفة الزائفة البسيطة أعلاه. يتم "اختراع" فئة فعلية مثل ما سبق "تم اختراعها" من قبل برنامج التحويل البرمجي ، مع تطبيق فريد محدد (غالبًا بما في ذلك الرموز التي لا يمكن أن تحتوي عليها أي نوع محدد من قبل المستخدم) (لا أعرف ما إذا كان من الممكن أن تتمكن من اتباع المعيار دون الاختراع مثل هذا الفصل ، ولكن كل مترجم أعرفه في الواقع يخلق الفصل).
يشبه بناء جملة Lambda الكامل:
[ capture_list ]( argument_list )
-> return_type optional_mutable
{
code
}
ولكن يمكن حذف العديد من الأجزاء أو تركها فارغة. يتوافق Capture_List مع كل من مُنشئ النوع المجهول الناتج ومتغيراته الأعضاء ، و engument_list وسيطات operator()
, ، ونوع الإرجاع نوع الإرجاع. يتم أيضًا استدعاء مُنشئ مثيل Lambda بطريقة سحرية عند إنشاء المثيل باستخدام Capture_List.
[ capture_list ]( argument_list ) -> return_type { code }
يصبح أساسا
struct some_anonymous_type {
// capture_list turned into member variables
some_anonymous_type( /* capture_list turned into arguments */ ):
/* member variables initialized */
{}
return_type operator()( argument_list ) const {
code
}
};
لاحظ ذلك في C ++ 20 تمت إضافة حجج القالب إلى Lambdas ، وهذا غير مغطى أعلاه.
[]<typename T>( std::vector<T> const& v ) { return v.size(); }
1 بالإضافة إلى ذلك ، يتم تخزين RTTI (TypeID) ، ويتم تضمين تشغيل النوع من الأرجوانيين.