overload کردن تابع بر اساس نوع مقدار بازگشتی تابع ورودی - هفت خط کد انجمن پرسش و پاسخ برنامه نویسی

overload کردن تابع بر اساس نوع مقدار بازگشتی تابع ورودی

+2 امتیاز

اگر من بک تابع داشته باشم که ورودیش funciton pointer یا لامبدا باشه مثلا :

template <class Funcion >
bool foo(Funcion func){
     return func();
}

آیا امکانش هست یک overload برای این تابع بنویسم که بر روی توابعی که نوع بازگشتیشون bool نیست یا به bool قابل تبدیل نیستن کار کنه ؟!

template <class Funcion >
bool foo(Funcion func){
     return func();
}

foo([](){return true;});//in kar mikone
foo([](){return "qwe";});//in kar mikone chon meghdar bazgashti be bool ghable tabdil nist

من متوجه نشدم چطور باید نوع بازگشتی تابع را زمان کامپایل فهمید

سوال شده شهریور 22, 1393  بوسیله ی PSPCoder (امتیاز 1,301)   14 40 57

1 پاسخ

+1 امتیاز
 
بهترین پاسخ

سلام برای چک کردن این که آیا یک نوع قابل تبدیل به نوع دیگر است از template class زیر باید استفاده کرد

template< class From, class To >
struct is_convertible;

 

برای بدست آوردن مقدار بازگشت از تابع هم  یا باید از decltype استفاده کرد یا از std::result_of 

std::result_of<Function()>::type;

//ya 

 decltype(Function());

برای overload کردن بر اساس انواع هم باید این از std::enable_if استفاده بشه  توضیحات مربوطهاین جا  هست .

 

پس در مجموع کد به این شکل میشه :

#include <iostream>
#include <type_traits>

//overload zir bar roo voroodi hayee ke no e bool bar migardoonan kar mikone
template <class Function>
typename std::enable_if<
    std::is_convertible<typename std::result_of<Function()>::type,
    bool>::value,bool/*return type*/
    >::type
foo(Function func)
{
    std::cout<<"In first overload\n";
    return func();
}

//bar rooye voroodi hayee ke return_type func voroodi be bool ghable tabdil nist
//kar mikone
template <class Function>
typename std::enable_if<
    !std::is_convertible<
    typename std::result_of<Function()>::type,
    bool>::value,bool/*return type*/
    >::type
foo(Function func)
{
    std::cout<<"In second overload\n";
    func();
    return true;//ya har chiz dg ie
}

int main()
{
    foo([](){return true;});//ok
    foo([](){return std::string("qwe");});//ok
}

http://rextester.com/BYLM7726

پاسخ داده شده شهریور 22, 1393 بوسیله ی BlueBlade (امتیاز 15,315)   15 18 89
انتخاب شد شهریور 22, 1393 بوسیله ی PSPCoder
...