gpt4 book ai didi

c++ - std::function 与 std::bind 配合得很好——但为什么呢?

转载 作者:太空狗 更新时间:2023-10-29 19:45:14 24 4
gpt4 key购买 nike

我正在使用 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::functioncppreference.com 上被称为“通用多态函数包装器”是有帮助的。 .那么是不是封装了一个uint64_t返回类型的函数呢?或者再次使用 operator () 语法来驱动函数的概念?

尽管这些结构非常有用,但我觉得我在某种程度上是对 cargo 崇拜的编程。我正在寻找一个能够以具体方式解决任何歧义的答案,并增加对类似问题的洞察力 - bind 参数如何交互,以及 function签名反射(reflect)了什么?


我没有收到关于 std::bind任何积极反馈。大量关于简单使用 lambda 函数的优越结果(和代码生成),即使在如此简单的情况下也是如此。我自己的测试验证了这一点。

最佳答案

std::bindstd::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/

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