关于模板函数的void返回值的判断:std::is_void与模板特化
int返回值的函数参数测试
#include <iostream>
#include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}int main(int argc, char *argv[])
{std::cout << CallDeviceMethodShort<int>(return_int_func) << std::endl << std::flush;return 0;
}
void类型的函数
#include <iostream>
#include <functional>void return_void_func(){std::cout << __func__ << std::endl << std::flush;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}int main(int argc, char *argv[])
{CallDeviceMethodShort<void>(return_void_func);return 0;
}
报错:
解决办法:模板特化
错误的实例
#include <iostream>
#include <functional>int return_int_func(){std::cout << __func__ << std::endl << std::flush;return 10086;
}void return_void_func(){std::cout << __func__ << std::endl << std::flush;
}template<class U>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)> {auto ret = method();return ret;
}//模板特化
template<class U>
void CallDeviceMethodShort(std::function<void()> method) {method();
}int main(int argc, char *argv[])
{CallDeviceMethodShort<void>(return_int_func);CallDeviceMethodShort<void>(return_void_func);return 0;
}
执行结果
由结果可知,两次调用的都是函数CallDeviceMethodShort,这显然不是我们想要的结果
正确的实例:
#include <iostream>
#include <functional>
#include <type_traits>#define END (std::endl) << (std::flush)#define OUT(a) \std::cout << #a<< "=" << a << ENDfloat return_float_func(){std::cout << __func__ << END;return 1.0086;
}int return_int_func(){std::cout << __func__ << END;return 10086;
}void return_void_func(){std::cout << __func__ << END;
}template<class U,std::enable_if_t<!std::is_void<U>::value, int> = 0>
auto CallDeviceMethodShort(std::function<U()> method) -> std::invoke_result_t<decltype(method)>
{auto ret = method();std::cout << __func__ << __LINE__ << END;return ret;
}//模板特化
template<class U, std::enable_if_t<std::is_void<U>::value, int> = 0>
void CallDeviceMethodShort(std::function<U()> method) {method();std::cout << __func__ << __LINE__ << END;
}int main()
{int a = CallDeviceMethodShort<int>(return_int_func);OUT(a);float f = CallDeviceMethodShort<float>(return_float_func);OUT(f);CallDeviceMethodShort<void>(return_void_func);return 0;
}
执行结果: