在类中随机使用 C++0x TR1,以降低开销
我正在使用 VC 2010,并试图通过将随机定义放置在每个类实例的构造函数中,然后根据需要从那里进行调用,来降低某些函数的开销和重复代码。我现在所拥有的,简化的是:
#include <random>
#include <Windows.h>
mt19937 eng(GetTickCount());
class Cycles {
int line;
normal_distribution<> rand_norm;
variate_generator<mt19937&,normal_distribution<>> r_norm;
public:
Cycles()
: rand_norm(0.85,0.05),
r_norm(eng,rand_norm) {
line=0;
}
}
不幸的是,这不起作用,我最终得到了这个错误:
\vc\include\random(513): 错误 C2248: 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' : 无法访问类 'std::tr1::_Ewrap< 中声明的私有成员;_Engine,_Tgt_type>'
\vc\include\random(446) :参见 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' 的声明
此诊断发生在编译器生成的函数“std::tr1::variate_generator<_Engine,_Distrib>”中&std::tr1::variate_generator<_Engine,_Distrib>::operator =(const std::tr1::variate_generator<_Engine,_Distrib> &)'
我知道这些应该在构造函数打开之前初始化,否则它会因为缺少默认构造函数而出错,但我不明白为什么会失败。我的C++ fu已经很生疏了。
我见过的每个示例都显示分配器和生成器在调用它的函数中全局或本地初始化,这对我来说似乎很愚蠢,因为我有几个将使用在紧密循环中调用的 r_norm 的成员函数。它严重未通过气味测试。没有人知道我错过了什么吗?
I'm using VC 2010 and trying to keep the overhead and duplicated code of certain functions low, by placing the random definitions in the constructor of each class instance, then calling as necessary from there. What I have now, simplified, is:
#include <random>
#include <Windows.h>
mt19937 eng(GetTickCount());
class Cycles {
int line;
normal_distribution<> rand_norm;
variate_generator<mt19937&,normal_distribution<>> r_norm;
public:
Cycles()
: rand_norm(0.85,0.05),
r_norm(eng,rand_norm) {
line=0;
}
}
Unfortunately that doesn't work, and I end up with this error:
\vc\include\random(513): error C2248: 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator =' : cannot access private member declared in class 'std::tr1::_Ewrap<_Engine,_Tgt_type>'
\vc\include\random(446) : see declaration of 'std::tr1::_Ewrap<_Engine,_Tgt_type>::operator ='
This diagnostic occurred in the compiler generated function 'std::tr1::variate_generator<_Engine,_Distrib> &std::tr1::variate_generator<_Engine,_Distrib>::operator =(const std::tr1::variate_generator<_Engine,_Distrib> &)'
I understand that these should be initialized prior to the opening of the constructor, or else it errors because of the lack of a default constructor, but I don't understand why this fails. My C++ fu is quite rusty.
Every example I've seen shows the distributor and generator being initialized globally or locally in the function that calls it, which seems silly to me, as I have several member functions that will be using r_norm that are called in a tight loop. It fails the smell test badly. Doesn't anyone know what I'm missing?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
c++0x 中使用
bind()
而不是variate_generator
:该图的灵感来自 C++0xFAQ。
输出
bind()
is used in c++0x instead ofvariate_generator<>
:The plot is inspired by C++0xFAQ.
Output
手头没有 MSVC,但是使用 gcc,如果您替换
为
(注意缺少
&
),则可以编译。顺便说一句,
std::random_device
可能是比 GetTickCount() 更好的随机源,尽管我不知道它是如何在 MSVC 中实现的。don't have MSVC at hand, but with gcc, this will compile if you replace
with
(note the lack of
&
)Incidentally,
std::random_device
is probably a better source of randomness thanGetTickCount()
, although I don't know how it's implemented in MSVC.不能使用非静态表达式初始化全局变量。
You cannot initialize a global variable with a non-static expression.