是否有记录的方法来重置现有std :: exponential_distribution对象上的lambda参数?

时间:2017-04-03 22:17:29

标签: c++ c++11 exponential-distribution

当我查看std::exponential_distribution的文档时,似乎没有公开在运行时更改lambda参数的标准方法。

param方法,但它采用opaque成员类型param_type,并且获取此类对象的唯一记录方法是调用param而不带参数,但这意味着必须首先使用该参数创建不同的实例。

下面,我展示了两种未记录的重置编译lambda的方法,但我不知道它们是否会在运行时产生正确的行为。

#include <random>
#include <new>

int main(){
    std::random_device rd;
    std::mt19937 gen(rd());
    std::exponential_distribution<double> intervalGenerator(5);

    // How do we change lambda after creation?
    // Construct a param_type using an undocumented constructor?
    intervalGenerator.param(std::exponential_distribution<double>::param_type(7));

    // Destroy and recreate the distribution?
    intervalGenerator.~exponential_distribution();
    new (&intervalGenerator) std::exponential_distribution<double>(9);
}

是否有记录的方法可以执行此操作,如果没有,是否可以安全使用这两种解决方案?

1 个答案:

答案 0 :(得分:5)

只需将新生成器分配给旧实例:

std::exponential_distribution<double> intervalGenerator(5);
intervalGenerator = std::exponential_distribution<double>(7);

便携,易读且明显正确。

此外,

intervalGenerator.param(std::exponential_distribution<double>::param_type(7));

在N3337和N4141中如26.5.1.6/9中所述是安全的,因此您也可以使用它。但是对于第一个变体,开始时不会出现可移植性问题。