c++ - 具有不同返回类型的函数变体

标签 c++ variant std-function

下面的代码无法编译:

#include <functional>
#include <variant>

int main() {
  using ret_void = std::function<void()>;
  using ret_int  = std::function<int()>;

  std::variant<ret_void, ret_int> var;
  var.emplace([](){ return 1; } );
}

编译显示模板参数推导/替换失败。 谁能解释一下为什么编译失败?

最佳答案

编译失败,因为 std::variant::emplace需要给出 emplace 的变体替代方案的类型或索引:

#include <functional>
#include <variant>

int main() {
  using ret_void = std::function<void()>;
  using ret_int  = std::function<int()>;

  std::variant<ret_void, ret_int> var;
  var.emplace<ret_int>([](){ return 1; });
}

std::variant::emplace 所有重载的第一个模板参数 [variant.mod]是 emplace 的替代变体的索引或类型。这些重载都没有以可推导的方式使用此参数......

关于c++ - 具有不同返回类型的函数变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59401666/

相关文章:

链接 postgresql 时出现 C++ 链接错误

java - JNI : Direct buffer reading & writing

C++17 std::variant 头文件 (clang 6.0.0)

vba - "Dim myarray() as String"VS "Dim myarray() as Variant"

c++11 - 使用 std::bind 和 std::function 时回调失败

c++ - 存储和传递 std::function - 按值还是按引用?

c++ - 为什么 bind(..) for ipv6 under mac os x 给我错误号 47

c++ - 我如何从 Cocoa 中获取 'break away' 并在 C/C++ 中开发 Mac OpenGL 应用程序?

c++ - 如何制作简化版的 boost::variant?

c++ - 通过构造函数自定义排序映射