gpt4 book ai didi

c++ - 传递一个自由函数来调用?

转载 作者:搜寻专家 更新时间:2023-10-31 00:27:43 24 4
gpt4 key购买 nike

考虑以下代码:

void f(int) {std::cout << "void f(int)" << std::endl;}
void f(double) {std::cout << "void f(double)" << std::endl;}
void f(int*) {std::cout << "void f(int*)" << std::endl;}
std::invoke(f, 3);

我有两个问题:

  • 使用自由函数(不是仿函数),是否可以传递 f 的整个重载集并让 invoke 选择正确的一个? (没有任何辅助类,纯语言题)
  • 如果不可能,那么如何将 void f(int) 传递给 invoke? (那么所有可能的语法是什么,如果有几个)

最佳答案

最好的方法是手动创建重载集。

#define OVERLOADS_OF(name) [&](auto&&... args) -> decltype(name(FWD(args)...)) noexcept(noexcept(name(FWD(args)...))) { return name(FWD(args)...); }

然后传入:

invoke(OVERLOADS_OF(f), 3)

这样,编译器仍在为我们做重载解析——我们不必自己做——并且根据需要/预期调用采用 int 的重载。

请注意,这并不完全等同于直接传递预期的函数(值得注意的异常(exception)情况包括按值获取不可移动类型的对象的函数),但这是您在没有明确的手动类型选择的情况下所能做的最好的事情。

关于c++ - 传递一个自由函数来调用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47984031/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com