具有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最终选择的哪个版本之前,我怎么知道外参数应该是哪种类型

0x499602D2
using post_process_type = decltype(process(std::declval<T>()));

这样就可以了。decltype在重载解决方案选择正确的之后,我只会看返回类型process

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

invoke_result获取模板成员函数的返回类型

std::invoke_result 在具有自动返回类型的模板函数中不起作用

带成员(operator [])函数的invoke_result

从非成员模板函数访问私有内部类类型

非成员函数模板何时具有内部链接?

具有重载成员函数的多线程

具有类成员函数的返回类型的enable_if

使用带有无效参数类型的invoke_result吗?

重载具有 2 个相同数据类型成员的构造函数

在“ std :: result_of”中没有名为“ type”的类型;从重载函数获取返回类型

具有不同返回类型的重载功能

具有不同返回类型的方法重载

模板化类如何解决按其类型之一调用的重载非成员函数?

成员与非成员函数,返回副本还是引用?

有关具有不同返回类型的函数重载的问题

如何检查成员函数是否具有const重载?

具有重载成员函数的C ++ std :: mem_fn

运算符重载:仅可包含相同类型对象的成员与非成员

具有未定义的成员函数返回类型的模板实例化

具有相同名称和参数,不同返回类型的C ++成员函数

具有尾随返回类型的模板成员函数,即使未使用也会给出错误

打字稿推断问题-导出函数的返回类型具有或正在使用名称...但是无法命名

当返回类型成员具有联合类型时,从方法强制确定成员的返回类型

const在非成员函数声明的开头有什么作用?

在非成员函数上使用delete有什么意义?

TypeScript:覆盖具有重载的方法返回类型

固定大小数组的非成员std :: empty重载的返回值

类型名称,类型成员和非成员类型:是有效的代码?

调用非成员运算符重载