将 std::bind 的结果传递给 std::function “重载”

2024-02-23

我有类似的问题在 C++ 中将不同的 lambda 传递给函数模板 https://stackoverflow.com/questions/40523248/passing-different-lambdas-to-function-template-in-c但现在有了由创建的包装器std::bind而不是 lambda。

我有两个方法重载Add采取不同形式的std::function:

template<typename T>
struct Value
{
    T value;
};

template <typename T>
void Add(Value<T> &value, function<bool()> predicate)
{
}

template <typename T>
void Add(Value<T> &value, block_deduction<function<bool(const Value<T> &)>> predicate)
{
}

现在,这对于 lambda 可以正常工作,但对于与 绑定的函子则失败std::bind:

struct Predicates
{
    bool Predicate0() { return true; }
    bool Predicate1(const Value<int> &) { return true; }
};

Predicates p;
Add(i, std::bind(&Predicates::Predicate0, &p));

失败了

错误 C2668:“添加”:对重载函数的不明确调用

and

Add(i, std::bind(&Predicates::Predicate1, &p, _1));

静态断言失败(Visual C++ 2015,更新 3):

元组索引越界

有没有办法让它同时适用于 lambda 和绑定函子?我会考虑使用 SFINAE 来启用基于is_bindable_expression并检查参数类型,但我无法将其放在一起。


停止使用std::bind。这是一堆随机的特征和怪癖。

今天的怪事是std::bind将接受无限数量的参数并丢弃任何额外的参数。明天你可能会遇到这样一个事实:std::bind结果到std::bind会施展奇怪的魔法。

std::bind被移植到boost同时 lambda 也被添加到该语言中。 Lambda 几乎解决了所有问题bind语法同样清晰,并且没有无数的怪癖bind确实如此,尤其是在 C++14 之后autolambda 可用。 (大多数 C++11 编译器也支持auto拉姆达)。

您可以编写函数,以便在它们同时适用时,其中一个或另一个成为首选重载。但这样做会给你的界面增加一堆噪音,在这种情况下,你想要这种偏好的唯一原因是因为std::bind正在做一些愚蠢的事情。

围绕设计不佳的一点进行工程std图书馆不值得。只需停止使用设计不佳的部分即可std库,或在使用时显式转换。


如果失败,请执行以下操作:

template <class T, class F,
  std::enable_if_t<
    std::is_convertible<
      std::result_of_t<std::decay_t<F> const&(Value<T> const&)>,
      bool
    >{}, int
  > = 0
>
void Add(Value<T> &value, F&& f)
{
  // do pass f Value<T>
}
template <class T, class F,
  std::enable_if_t<
    !std::is_convertible<
      std::result_of_t<std::decay_t<F> const&(Value<T> const&)>,
      bool
    >{}
    && std::is_convertible<
      std::result_of_t<std::decay_t<F> const&()>,
      bool
    >{}, int
  > = 0
>
void Add(Value<T> &value, F&& f)
{
  // do not pass f Value<T>
}

我们对您想要使用的两个重载中的哪一个进行了一些令人讨厌的 SFINAE 检测,并且明确更喜欢其中一个。

这是不值得的。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 std::bind 的结果传递给 std::function “重载” 的相关文章

  • 为什么在连接两个字符串时 Python 比 C 更快?

    目前我想比较 Python 和 C 用来处理字符串的速度 我认为 C 应该比 Python 提供更好的性能 然而 我得到了完全相反的结果 这是 C 程序 include
  • 使用 C# 登录《我的世界》

    我正在尝试为自己和一些朋友创建一个简单的自定义 Minecraft 启动器 我不需要启动 Minecraft 的代码 只需要登录的实际代码行 例如 据我所知 您过去可以使用 string netResponse httpGET https
  • 如何捕获未发送到 stdout 的命令行文本?

    我在项目中使用 LAME 命令行 mp3 编码器 我希望能够看到某人正在使用什么版本 如果我只执行 LAME exe 而不带参数 我会得到 例如 C LAME gt LAME exe LAME 32 bits version 3 98 2
  • 为什么pow函数比简单运算慢?

    从我的一个朋友那里 我听说 pow 函数比简单地将底数乘以它的指数的等价函数要慢 例如 据他介绍 include
  • IdentityServer 4 对它的工作原理感到困惑

    我阅读和观看了很多有关 Identity Server 4 的内容 但我仍然对它有点困惑 因为似乎有很多移动部件 我现在明白这是一个单独的项目 它处理用户身份验证 我仍然不明白的是用户如何注册它 谁存储用户名 密码 我打算进行此设置 Rea
  • 如何判断计算机是否已重新启动?

    我曾经使用过一个命令行 SMTP 邮件程序 作为试用版的限制 它允许您在每个 Windows 会话中最多接收 10 封电子邮件 如果您重新启动计算机 您可能还会收到 10 个以上 我认为这种共享软件破坏非常巧妙 我想在我的应用程序中复制它
  • 当一组凭据下的计划任务启动的进程在另一组凭据下运行另一个程序时,Windows 是否有限制

    所以我有一个简单的例子 其中我有应用程序 A 它对用户 X 本地管理员 有一些硬编码的凭据 然后它使用硬编码的绝对路径启动带有这些凭据的应用程序 B A 和 B 以及 dotnet 控制台应用程序 但是它们不与控制台交互 只是将信息写入文件
  • 对 std::vector 进行排序但忽略某个数字

    我有一个std vector
  • 在Linux中,找不到框架“.NETFramework,Version=v4.5”的参考程序集

    我已经设置了 Visual studio 来在我的 Ubuntu 机器上编译 C 代码 我将工作区 我的代码加载到 VS 我可以看到以下错误 The reference assemblies for framework NETFramewo
  • 在mysql连接字符串中添加应用程序名称/程序名称[关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在寻找一种解决方案 在连接字符串中添加应用程序名称或程序名称 以便它在 MySQL Workbench 中的 客户端连接 下可见 SQL
  • 高效列出目录中的所有子目录

    请参阅迄今为止所采取的建议的编辑 我正在尝试使用 WinAPI 和 C 列出给定目录中的所有目录 文件夹 现在我的算法又慢又低效 使用 FindFirstFileEx 打开我正在搜索的文件夹 然后我查看目录中的每个文件 使用 FindNex
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测
  • 打印大型 WPF 用户控件

    我有一个巨大的数据 我想使用 WPF 打印 我发现WPF提供了一个PrintDialog PrintVisual用于打印派生的任何 WPF 控件的方法Visual class PrintVisual只会打印一页 因此我需要缩放控件以适合页面
  • C++ new * char 不为空

    我有一个问题 我在 ASIO 中开发服务器 数据包采用尖头字符 当我创建新字符时 例如char buffer new char 128 我必须手动将其清理为空 By for int i 0 i lt 128 i buffer i 0x00
  • 将数组作为参数传递

    如果我们修改作为方法内参数传递的数组的内容 则修改是在参数的副本而不是原始参数上完成的 因此结果不可见 当我们调用具有引用类型参数的方法时 会发生什么过程 这是我想问的代码示例 using System namespace Value Re
  • 可访问性不一致:参数类型的可访问性低于方法

    我试图在两个表单之间传递一个对象 基本上是对当前登录用户的引用 目前 我在登录表单中有一些类似的内容 private ACTInterface oActInterface public void button1 Click object s
  • 堆栈是向上增长还是向下增长?

    我在 C 中有这段代码 int q 10 int s 5 int a 3 printf Address of a d n int a printf Address of a 1 d n int a 1 printf Address of a
  • 灵气序列解析问题

    我在使用 Spirit Qi 2 4 编写解析器时遇到一些问题 我有一系列键值对以以下格式解析
  • 不区分大小写的字符串比较 C++ [重复]

    这个问题在这里已经有答案了 我知道有一些方法可以进行忽略大小写的比较 其中涉及遍历字符串或一个good one https stackoverflow com questions 11635 case insensitive string
  • OpenCV SIFT 描述符关键点半径

    我正在深入研究OpenCV的SIFT描述符提取的实现 https github com Itseez opencv blob master modules nonfree src sift cpp 我发现了一些令人费解的代码来获取兴趣点邻域

随机推荐

  • Powershell 在 System.Drawing 中使用 .NET .DrawImage

    我正在制作一个工具 可以自动裁剪和定位 无需将图像大小调整为其他图像 我发现this https learn microsoft com en us dotnet api system drawing graphics drawimageu
  • 我正在评估 Google Pub/Sub 与 Kafka。有什么区别? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我对kafka的工作不多 但想在GCE中构建数据管道 所以我们想了解 Kafka 与 PUB Sub 基本上我想知道Kafka和Pub
  • 转换为 Func 与新 Func?

    下面两条语句有什么区别吗 他们都工作 if Func
  • 如何在 C# 中为控件添加移动效果?

    我的 C 表单中有一个面板 并且有一个按钮 当我单击按钮时 会显示不可见的面板 相反 我希望面板移入或滑入 例如 当您单击组合框时 下拉列表不会弹出 我希望我的面板像那样显示 我怎样才能做到这一点 窗口动画是 Windows 的内置功能 这
  • 无法传入 lambda 来申请 pandas DataFrame

    我正在尝试将函数应用于 pandas DataFrame 的所有行 实际上只是该 DataFrame 中的一列 我确信这是一个语法错误 但我知道我做错了什么 df col apply lambda x y x y total seconds
  • CLR 项目的智能感知 - 例如没有智能感知系统.Windows.窗体

    我一直在关注一些关于某些内容的两个教程Visual C 基础知识 http www functionx com vccli general introprogramming htm但他们似乎都缺乏有关我如何在 Visual Studio 2
  • Google AppInvites 中断构建

    您的应用程序的一部分build gradle这是 tasks withType com android build gradle tasks PackageApplication pkgTask gt pkgTask jniFolders
  • 如何在v-html中运行脚本

    我从数据库获取嵌入代码 Instagram Twitter 等 如何将它们绑定到 vue 组件 有没有办法在v html中执行脚本标签 简短的回答 你不能 一旦 dom 加载 您的浏览器就会阻止脚本标签的执行 长答案 您可以尝试匹配脚本的
  • 如何保留对 NPM 模块所做的本地更改?

    我已经使用 NPM 拉下了一个节点模块 并将其添加到package json 然而 需要更改模块的一些代码 因为它没有 100 满足我的要求 通常当我使用节点时git我会忽略node modules目录及使用npm install部署到服务
  • CSS - 并排的内联块,宽度为 100%

    我有两个带有文本的块 文本的长度不是恒定的 用户输入 左侧块中包含短文本 但右侧块可能包含非常长的文本 这些块应该并排出现 并且分布在父级恒定宽度的 100 上 不多也不少 简化示例 https jsfiddle net hh6a03cy
  • 在恒定空间和线性时间内向后打印单链表

    我听到一个面试问题 向后打印单链表 在恒定空间和线性时间中 我的解决方案是反转链接列表 然后像这样打印它 还有其他非破坏性的解决方案吗 您已经找到了大部分答案 将链表反转到位 然后将列表遍历回开头以打印它 为了防止它 永久 破坏性 请就地反
  • AtomicBoolean 与同步块

    我试图通过替换一些来减少代码中的线程争用synchronized块与AtomicBoolean 这是一个例子synchronized public void toggleCondition synchronized this mutex i
  • Subversion 和 CVS 中添加自动内容的标签怎么称呼?

    像 log and version 在签入文件时添加数据 我有兴趣查看其他人以及他们可以提供哪些信息 但除非我知道他们叫什么 否则我无法获得太多信息 Subversion 和 CVS 都称它们为Keywords 在这里查看 SVN 手册 h
  • 窗口函数过滤当前行

    这是后续this https stackoverflow com questions 48000013 optimize slow aggregates in lateral join问题 我的查询被改进为使用窗口函数而不是内部的聚合LAT
  • 你如何制作一个makefile

    我想知道如何为 Unix 创建 makefile 这里有一个好的生成文件教程 http oucsace cs ohiou edu bhumphre makefile html 搜索 如何创建 makefile 后 Google 上的第一个结
  • 修复 Chocolatey“访问被拒绝”的问题

    我刚刚第一次使用安装了 Chocolateythis https i stack imgur com fw9WX png管理员 cmd 中的命令 SystemRoot System32 WindowsPowerShell v1 0 powe
  • dlopen 中对 __dlopen 的未知引用

    dlopen位于libdl a但是当我将我的应用程序链接到libdl a gcc 链接器抛出此错误 unknow reference to dlopen called in dlopen 我应该导入另一个吗 a 当我尝试静态编译时dlope
  • C 将输入文本文件解析为单词

    我正在尝试将输入文件 包含具有多行和分隔符的文本文档 即 解析为单词 我的函数 分割函数 是 int splitInput fp int i 0 char line 255 char array 5000 int x while fgets
  • Java Lambda:迭代 2 个暗淡数组并保持当前索引

    我是 Java 8 的 Lambda 表达式的新手 我想制定以下内容 我有一个二维数组 我想在应用程序代码中对其进行多次迭代 并对数组中的项目进行处理 在我执行以下操作之前 public static abstract class BlaB
  • 将 std::bind 的结果传递给 std::function “重载”

    我有类似的问题在 C 中将不同的 lambda 传递给函数模板 https stackoverflow com questions 40523248 passing different lambdas to function templat