- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在使用 std::uniform_int_distribution
生成素数 (p)
。我将分发对象放在一个匿名 namespace 中——这对于成年人来说似乎是 C++ 的“静态链接”...
namespace
{
// a more pedantic range: [2, 18446744073709551557]
std::uniform_int_distribution<uint64_t> p_dist {2};
std::mt19937 rng; // (sufficient IV states for uniqueness)
}
请注意,我在可移植代码允许的范围内尽可能彻底地为 Mersenne Twister 播种。但这对问题来说并不重要。这只是为了向读者保证我正确使用了随机工具:
std::seed_seq::result_type data[rng.state_size];
std::random_device rdev;
std::generate_n(data, rng.state_size, std::ref(rdev));
std::seed_seq rng_seed (data, data + rng.state_size);
rng.seed(rng_seed);
这非常方便,因为我有一个确定性的 u64_prime(p)
函数,使用 (7) bases
, 可以判断 (p)
是否为质数:
uint64_t p;
while (!u64_prime(p = p_dist(rng)))
;
现在我创建一个 std::function
对象:
std::function<uint64_t()> zp_rng = std::bind(
decltype(p_dist){0, p - 1}, std::ref(rng));
可以调用此函数:zp_rng()
以返回 Z(p)
中的随机数。也就是说,使用来自引用 rng 结果的分布对象:[0, p - 1]
。
现在这非常令人印象深刻 - 但我通过剪切和粘贴有效地采用了它,对 std::function
和交互之间的交互知之甚少给 std::bind
的参数。
我对 decltype(p_dist){0, p - 1}
没有感到困惑 - 这只是一种指定我们仍想使用 std::uniform_int_distribution
。我对 std::ref(rng)
的理解是它阻止了 rng 的本地拷贝被实例化,并强制使用引用......所以:
问:有效确定的基本规则是什么:正在使用dist(rng)
- 我不明白为什么std::bind
将强制执行此交互。许多交互似乎都基于 operator ()
方法。
Q:std::function
在 cppreference.com 上被称为“通用多态函数包装器”是有帮助的。 .那么是不是封装了一个uint64_t
返回类型的函数呢?或者再次使用 operator ()
语法来驱动函数的概念?
尽管这些结构非常有用,但我觉得我在某种程度上是对 cargo 崇拜的编程。我正在寻找一个能够以具体方式解决任何歧义的答案,并增加对类似问题的洞察力 - bind
参数如何交互,以及 function
签名反射(reflect)了什么?
我没有收到关于 std::bind
的任何积极反馈。大量关于简单使用 lambda 函数的优越结果(和代码生成),即使在如此简单的情况下也是如此。我自己的测试验证了这一点。
最佳答案
std::bind
与 std::function
有点无关,它所做的只是包装一些可调用的东西,以便始终传递一组特定的参数,请参阅https://en.cppreference.com/w/cpp/utility/functional/bind
std::function
只接受任何符合您指定为模板参数的函数签名的可调用对象。
std::uniform_int_distribution
是可调用的,因为它指定了一个 operator()
,参见 https://en.cppreference.com/w/cpp/numeric/random/uniform_int_distribution/operator() .这特别需要一个发电机。我们使用 bind 围绕它创建一个包装器,这样我们就不必总是显式地传递生成器。然后将结果存储在 std::function
中,匹配 uint64_t 返回类型且没有参数(因为生成器参数已绑定(bind))。
如果这个概念对您来说很陌生,您应该阅读运算符重载,请参阅 https://en.cppreference.com/w/cpp/language/operators (特别是函数调用运算符)。
关于c++ - std::function 与 std::bind 配合得很好——但为什么呢?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56916870/
自定义限流注解 先介绍一下 @Retention 和 @Target 这两个元注解 @Retention: 指定注解的生命周期(源码、class文件、运行时),其参考值见类的定义:java.lang.
在 Ubuntu 13.10 中使用 PyCharm Community Edition 和 IdeaVim 时,键盘经常停止接受输入,我必须重新启动 IDE。当我单击不同的文本区域时,光标仍然会移动
我正在开发一个Java项目,我试图让useDelimiter删除除“=”和“,”之间的文本之外的所有内容。例如,在文件的第一行我想保留“ThermostatNight”。 文本文件如下所示: E
这个问题不太可能帮助任何 future 的访问者;它只与一个小的地理区域、一个特定的时间点或一个非常狭窄的情况有关,这些情况并不普遍适用于互联网的全局受众。为了帮助使这个问题更广泛地适用,visit
目录 1、加入 remember-me 2、原理分析 自动登录是我们在软件开发时一个非常常见的功能,例如我们登录 QQ 邮箱: 很多网站我们在登录的时
我是开发 Android 应用程序的菜鸟。我想问一下。我的 PreferenceActivity 如何希望在不返回 MainActivity 并再次转到 PreferenceActivity 的情况下
1. 前言 大家好,我是安果! 我们都知道 Python 可以用来开发桌面应用,一旦功能开发完成,最后打包的可执行文件体积大,并且使用 Python 开发桌面应用周期相对较长 假如想快速开
我正在为命令行应用程序编写一个非常简单的 GUI 工具。它只有 2 个按钮。 连接并退出。 在 applicationDidFinishLaunching 中,我运行以下命令 NSPipe *pipe
我也在 LibGDX forums 上发布了这个问题. 嘿那里!在我的论文中,我正在编写一个 DSL 来描述图片的外观。这些图片将由 libGDX 根据 DSL-Input 绘制。目前,jetbrai
准备 SpringBoot 工程 1.新建 SpringBoot 项目,默认的端口是 8080 ,新建 Controller 和 Mapping @RestControllerpublic cla
我有类似的问题 this one 以下是我使用的: CDH4.4(配置单元 0.10) protobuf-java-.2.4.1.jar elephant-bird-hive-4.6-SNAPSHOT
我想使用 angularjs 和 angular-ui(特别是 ui-select2 功能)实现对选择输入的读/写访问控制。 场景很简单:通过使用 ng-readonly 属性,我可以控制用户是否可以
我是一名优秀的程序员,十分优秀!