gpt4 book ai didi

c++ - 可变泛型 lambda 和函数重载

转载 作者:行者123 更新时间:2023-12-01 14:03:45 26 4
gpt4 key购买 nike

我有以下可变参数通用 lambda 并重载 foo()功能定义。

template <typename Lambda>
auto bar(Lambda&& lambda) {
return [lambda = std::forward<Lambda>(lambda)](auto&& ...args) {
return lambda(std::forward<decltype(args)>(args)...);
};
}

void foo(std::function<void()>&& cmd, std::function<void()>&& callback) { std::cout << "void" << std::endl; }
void foo(std::function<bool()>&& cmd, std::function<bool()>&& callback) { std::cout << "bool" << std::endl; }

以下3 foo()调用打印“void”。
int main()
{
// 1
foo(
bar( []() {} ),
bar( []() {} )
);
// 2
foo(
bar( []() { return true; } ),
bar( []() {} )
);
// 3
foo(
bar( []() {} ),
bar( []() { return true;} )
);
// 4) compiler error: foo is ambiguous
// foo(
// bar( []() { return false; } ),
// bar( []() { return true; } )
// );
}

你能帮我理解为什么它成功编译语句 1-3 但编译语句 4 失败吗?

海湾合作委员会 7.5.0

最佳答案

std::function<void()>可以存储具有任何返回类型( void 或不)的函数,其返回值将被丢弃。

因此,在 (4) 中,两种重载都适用,编译器无法决定使用哪一种。

另一方面,在 (1)、(2) 和 (3) 中,两个 lambda 表达式中的至少一个返回 void ,所以 bool foo 过载不适用。

可能的解决方案是:

  • 将仿函数传递给 foo 时,将其转换为合适的特化 std::function第一的。 (看起来不太好)
  • std::function 编写自定义包装/替换,构造函数使用不同的 SFINAE。 (需要努力)
  • 制作 foo模板(使用模板参数作为回调的类型)。然后使用 decltype确定返回类型,并采取相应的行动。 (这就是我要做的)
  • 关于c++ - 可变泛型 lambda 和函数重载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62224612/

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