سلام برای چک کردن این که آیا یک نوع قابل تبدیل به نوع دیگر است از 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