c++ - 如何在 c++17 或 20 中使用 std::invoke_result_t 而不是 c++14 中的 std::result_of_t?
问题描述
当我在 c++14 中使用 std::result_of_t 时,它正在按照我的意愿进行:
void just_simple()
{
std::cout << "【4】: in func return nothing. " << std::endl;
}
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
//typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
int main(){
InTemplate_Call(just_simple);
return 0;
}
ReturnType
只是void
。_
但它不适用于 c++17 或 20:
template<typename Callback, typename... Args>
auto InTemplate_Call(Callback&& bc, Args&&... args)
{
//typedef typename std::result_of_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
typedef typename std::invoke_result_t<std::decay_t<Callback>(std::decay_t<Args>...)> ReturnType;
if (typeid(ReturnType) == typeid(void))
{
std::cout << "get a void type" << std::endl;
}
return rtDeduction<ReturnType>::type();
}
ReturnType
不再是了void
!
有什么我做错了吗?
解决方案
invoke_result
和之间的区别在于result_of
前者接受可调用类型和参数类型,但你std::decay_t<Callback>(std::decay_t<Args>...)
只是一个返回的函数类型std::decay_t<Callback>
。
以下显示了差异:
#include <functional>
void just_simple() {}
template<typename Callback>
void foo(Callback&&)
{
static_assert(std::is_same_v<std::invoke_result_t<Callback()>, Callback>);
static_assert(std::is_same_v<std::invoke_result_t<Callback >, void>);
}
int main() {
foo(just_simple);
}
你应该做这个:
typedef typename std::invoke_result_t<
std::decay_t<Callback>,
std::decay_t<Args>...> ReturnType;
推荐阅读
- ruby-on-rails - 如何从控制器关注点调用模型
- java - 在信号量中调用 wait() 之前打印
- laravel - Laravel:返回更新后的模型和额外的数据透视
- php - 如何从我在 apache2 上的网页中删除 .php 文件扩展名
- r - 条件连接多个表覆盖而不是创建新列
- c++ - 更正代码 c++ 指针和删除
- java - Lombok @Builder 和 setter
- http-headers - 相当于 openvpn 上的 http-proxy-option 自定义标头
- android - 在不使用 StartActivity 的情况下在选择的 Uri 上打开 Stream
- c# - 将元素匹配到最接近的序列号并执行逻辑