C++ 是否有记录在案的方法来重置现有std::index_分布对象上的lambda参数?

C++ 是否有记录在案的方法来重置现有std::index_分布对象上的lambda参数?,c++,c++11,exponential-distribution,C++,C++11,Exponential Distribution,当我查看的文档时,它似乎没有公开在运行时更改lambda参数的标准方法 有一个param方法,但它采用不透明的成员类型param_type,并且获取此类型对象的唯一方法是调用param,不带任何参数,但这意味着必须首先使用该参数创建不同的实例 下面,我展示了两种没有文档记录的重置编译的lambda的方法,但我不知道它们是否会在运行时产生正确的行为 #include <random> #include <new> int main(){ std::random_d

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

有一个
param
方法,但它采用不透明的成员类型
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);
}
#包括
#包括
int main(){
std::随机_装置rd;
标准:mt19937 gen(rd());
指数分布区间发生器(5);
//创建后如何更改lambda?
//使用未记录的构造函数构造param_类型?
param(标准::指数分布::param类型(7));
//销毁并重新创建分发?
区间生成器。~指数分布();
新(&intervalGenerator)标准:指数分布(9);
}

是否有记录在案的方法来执行此操作,如果没有,两种解决方案中的任何一种都可以安全使用?只需为旧实例分配一个新的生成器即可:

std::exponential_distribution<double> intervalGenerator(5);
intervalGenerator = std::exponential_distribution<double>(7);
std::指数分布区间发生器(5);
间隔发生器=标准:指数分布(7);
便携式,易于阅读,明显正确


而且

intervalGenerator.param(标准::指数分布::参数类型(7));

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

我正试图将此更改的开销降至最低,并且我担心为额外的对象付费。一个人必须扔掉这个对象并创建一个全新的对象来重置一个参数,这似乎很愚蠢。@merlin2011不会有任何开销。停止浪费时间猜测性能,在实际发现问题后进行优化。@Fanael,公平点。也许我想得太多了P将在计时器过期时接受。@Fanael即使在
-O1
下也能工作。这是一个简单的优化compiler@Justin:即使在
-Og
下也能工作。我只是使用
-O3
作为默认值。它不是未记录的
param_type
始终可以使用与父发行版相同的参数构造。@Praetorian,有关于其构造函数的文档吗?我找不到。事实上,
param_type
可以使用与其分布相同的参数构造,这是
RandomNumberDistribution
概念(26.5.1.6/9)的要求之一。
intervalGenerator.param(std::exponential_distribution<double>::param_type(7));