std :: وظيفة مع وظيفة كمعلمة افتراضية

لدي رأس الطريقة هذا:

void Find(const _T & v, int max, const function & filter)

أنا أستخدم std :: function (الوظيفة) لأنني بحاجة إلى قبول تعبير دالة أو فنان أو lambda. أرغب في أن يكون الفلتر اختياريًا ، كما أن الإعداد الافتراضي يعمل دائمًا على إرجاع true (لا يتم تصفية أي شيء) كمعلمة افتراضية. لقد جربت شيئًا كهذا:

#include 

template 
bool alwaystrue(const E & e){ return true; }

template 
void Find(const T & v, int max,
          const std::function & filter = alwaystrue);

int main()
{
    Find(1, 2);
}

لكن هذا لا يجمع:

50016981.cpp: In function ‘void Find(const T&, int, const std::function&) [with T = int; E = int]’:
50016981.cpp:11:24: error: cannot resolve overloaded function ‘alwaystrue’ based on conversion to type ‘const std::function&’
     Find(1, 2);
                        ^

لقد حاولت أيضًا امتلاك الوظيفة داخل فئتي ولكني حصلت على خطأ مماثل.

هل هناك مشكلة في الدمج مع std :: function مع القوالب؟ وإذا كان الأمر كذلك ، هل يمكنك اقتراح كيفية القيام بما أريد؟ أريد تجنب التحميل الزائد على Find() (إن أمكن) لذلك ليس لدي شفرة مكررة.

0
كان هذا هو المشكلة ، شكرا لك.
وأضاف المؤلف skluzada, مصدر
Alexey يعمل بشكل جيد ، عندما أحدد حجة القالب ، وشكرا لكم.
وأضاف المؤلف skluzada, مصدر
لم تقم بتحديد وسائط القوالب عند استخدام alwaystrue في الإفادة Find .
وأضاف المؤلف keith, مصدر
ماذا عن استخدام لامدا للوسيطة الافتراضية؟ أو الحمولة الزائدة؟
وأضاف المؤلف Some programmer dude, مصدر
في ملاحظة غير ذات صلة ، يرجى قراءة ما هي قواعد حول استخدام تسطير أسفل السطر في معرف C ++؟ يتم حجز الرموز مثل _E أو _T في جميع النطاقات.
وأضاف المؤلف Some programmer dude, مصدر
ما هو الخطأ بالضبط؟ ماذا لو تخصصت معامل alwaystrue الخاص بك: void Find (const _T & v، int max، const function & filter = alwaystrue <_E>) ؟
وأضاف المؤلف Alexey, مصدر
راجع للشغل ، يتم محوَّل المعرفات التي تبدأ بـ الشرطة السفلية متبوعة بحرف كبير لأي غرض في C ++ (مما يعني أنها قد تكون وحدات ماكرو). فقط تفقد هذه الشرطات وستكون أكثر أمانًا!
وأضاف المؤلف Toby Speight, مصدر

1 إجابة

You need to indicate which instantiation of alwaystrue you want to use as your default, i.e. alwaystrue:

template 
void Find(const T& v, int max,
          const std::function& filter = alwaystrue);
0
وأضاف