我正在玩回调函数,并希望通过std::bind
签名不同的方式注册多个函数(尽管它们都返回void
)。将 的结果分配给“转换为非标量类型”错误中std::bind
的产量。std::variant
是歧义错误吗?我可以向编译器提供更多信息吗?
删除std::bind
(允许分配)不是一个选项,因为我希望使用一些注册回调
template <typename Function, typename... Args>
void register(Function &&f, Args &&... args)
{
variant_of_multiple_func_types = std::bind(f, args...);
}
例如:
std::variant<std::function<void()>, int> v = std::bind([]() noexcept {});
有效,但是
std::variant<std::function<void()>, std::function<void(int)>> v = std::bind([]() noexcept {});
没有,虽然我希望它编译成一个std::variant
包含std::function<void()>
.
我在 GCC 7.4.0 中收到以下编译错误-std=c++17
:
error: conversion from ‘std::_Bind_helper<false, main(int, char**)::<lambda()> >::type {aka std::_Bind<main(int, char**)::<lambda()>()>}’ to non-scalar type ‘std::variant<std::function<void()>, std::function<void(int)> >’ requested
std::variant<std::function<void()>, std::function<void(int)>> v = std::bind([]() noexcept {});