سؤال

فكر في فئة القالب مثل:

template<typename ReturnType, ReturnType Fn()>
class Proxy
{
    void run()
    {
        ReturnType ret = Fn();
        // ... do something ...
    }
};

// and a functions
int fn1() { return 5; }
float fn2() { return 5; }

يمكن إنشاء مثيل لذلك باستخدام:

Proxy<int, &fn1> p1;

لكن الإعلان بوضوح عن نوع قيمة الإرجاع يبدو غير ضروري.ما أحاول تحقيقه هو شيء مثل:

 someProxyInstantation<&fn1> p1;
 someProxyInstantation<&fn2> p2;

لسوء الحظ، لا أتوقع استخدام لغة c++، ويبدو أن هذا بمثابة ركن مخفي في اللغة (على الأقل بالنسبة لي).

إذا كان بإمكاني الانتقال من المؤشر إلى الوظيفة إلى نوعها - شيء من هذا القبيل:std::tr1::result_of<&fn>::type // خطأ 1 خطأ C2923:'std::tr1::result_of' :'fn1' ليس وسيطة صالحة لنوع القالب للمعلمة '_Fty'

الخطأ منطقي نظرًا لأن المعلمة ليست "نوعًا" على الإطلاق

يحتوي C++0x على decltype(&fn1) ولكن هذا على بعد سنوات.

هل هناك أي طريقة للقيام بذلك في C++03 (+ tr1)؟

قيود:- لا أرغب في تمرير العامل، يجب أن تظل f1 وf2 دالتين عالميتين لهما قيمة إرجاع (لا يمكن نقلهما إلى المعلمة).)

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

المحلول

هذا غير ممكن في C++ 03.إذا كنت تريد تمرير مؤشر دالة كمعلمة غير نوع، فيجب على المترجم معرفة نوع المعلمة.لذلك عليك توفير القطع المفقودة (في هذه الحالة، نوع الإرجاع).يمكنك إعطاء الوكيل مؤشر الوظيفة كقيمة في وقت التشغيل، وتزويده بنوعه باعتباره الوسيط الوحيد.ثم يمكنك كتابة دالة مولد تقوم بهذه المهمة:

template<typename T>
Proxy<T> make_proxy(T t) { return Proxy<T>(t); }

للأسف، في لغة C++ الحالية، لا يزال يتعين عليك إعطائها النوع لتعيينه لمتغير تلقائي:

Proxy<int(*)()> p = make_proxy(&fn1);

لا يمكنك استخدام auto p = make_proxy(&fn1); حتى الآن.لاحظ أنه إذا كنت تريد استخدام نوع دالة على الجانب الأيسر، فيجب عليك تغيير وظيفة المولد لتوفير نوع مؤشر دالة ليس:

template<typename T>
Proxy<typename boost::remove_pointer<T>::type> make_proxy(T t) { 
    return Proxy<typename boost::remove_pointer<T>::type>(t); 
}

الآن يمكنك أن تفعل

Proxy<int()> p = make_proxy(&fn1);

باستخدام الوكيل، يمكنك الآن القيام به فقط

doSomething(make_proxy(&fn1));

وإذا كان doSomething قالبًا أو متعدد الأشكال، فلن يتطلب منك معرفة نوع الوظيفة بالضبط.

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