c++ - 带有invoke_result的重载命名非成员函数的返回类型
问题描述
给定许多采用不同类型参数的重载函数,有没有办法在编译时在模板化上下文中获取特定重载的返回类型或参数类型之一?例如,考虑这种情况,重载函数将参数引用作为输出值:
struct struct_a { };
struct struct_b { };
struct struct_c { };
float process(struct_a) { return 5.0f; }
bool process(struct_b) { return true; }
int process(struct_c) { return -1; }
void process_in_place(struct_a, float& out) { out = 5.0f; }
void process_in_place(struct_b, bool& out) { out = true; }
void process_in_place(struct_c, int& out) { out = -1; }
template<typename T>
void do_process(T val)
{
auto result1 = process(val);
std::cout << result1 << std::endl;
// ???
//using post_process_type = std::invoke_result_t<decltype(process)&(std::declval<T>)>;
// ???
post_process_type result2;
process_in_place(val, result2);
}
int main()
{
do_process(struct_a());
do_process(struct_b());
do_process(struct_c());
}
process_in_place
在调用最终选择的任何版本之前,我怎么知道 out-param 应该是什么类型?
解决方案
using post_process_type = decltype(process(std::declval<T>()));
这会做。decltype
只会在重载决议选择正确后查看返回类型process
。
推荐阅读
- ios - 无法在 IOS 移动设备上运行我的颤振项目
- kotlin - 如何使用 kotlin dsl 配置 Shadow 插件
- python - 手动更改 Keras 卷积层的权重
- node.js - 执行 npm 命令时出现错误
- dialogflow-es - Dialogflow 实现显示错误“代码”:6,“消息”:“项目中 us-central1 区域中的函数 dialogflowFirebaseFulfillment ... 已存在”
- vb.net - 如何使用 Google YouTube API 检索和显示第一个结果链接?
- sql - Redshift:数值数据溢出(结果精度)
- node.js - 使用 MEAN 堆栈应用程序(托管在 Heroku 上)消除 CORS 策略错误
- node.js - 有没有办法检索图像然后在不和谐中显示它(不和谐机器人)
- nunit - 使用测试用例源加载多个测试时,NUnit 会减慢测试执行速度