在我的编程中,我需要创建用户定义的数量的 ublas向量。我想用
做这件事“的std ::产生”。但是我遇到编译错误,这使我无法做到。
我使用的代码是:
for (size_t a_= 0; a_ < p_; a_++)
{
ublas::vector<double> next_vhat(size_of_vec);
std::generate(next_vhat.begin(), next_vhat.end(), mygen.give_rnd);
v_hat_.push_back(next_vhat);
}
我必须专门为函数调用创建一个class
,因为std::generate
将不允许我使用带参数的函数作为第三个参数(“gen”,参见{{3我需要数字是正态分布的,所以对分布函数的函数调用必须包含随机数生成器作为参数。由于它不允许我用参数调用它,我不得不写一个为我这样做的课程。
我写的课程是:
class RandGen
{
public:
RandGen()
: generator()
, norm_dist(0.0,1.0)
, random_seed(static_cast<unsigned>(std::time(NULL)))
{}
double give_rnd() { return (double) norm_dist(generator); }
private:
base_gen_t generator;
boost::random::normal_distribution<double> norm_dist; //Standard normal distribution
unsigned random_seed;
};
在尝试编译整个内容时,我收到以下错误:
error: cannot convert ‘RandGen::give_rnd’ from type ‘double (RandGen::)()’ to type ‘double (RandGen::*)()’
我不知道编译器要我在这里做什么,或者为什么它在这方面有这么多麻烦。任何建议都非常感谢。
答案 0 :(得分:10)
您需要传递一个可调用对象。也就是说,函数指针(不是成员函数指针,它是mygen.give_rnd
是什么)或者是重载operator()
的类的对象。您只需将函数give_rnd
更改为:
double operator()() { return (double) norm_dist(generator); }
然后,只需将您的对象直接传递给std::generate
std::generate(..., ..., mygen);
如果由于某种原因,你想保持你的RandGen
课程原样,你需要将它包装在另一个仿函数或lambda中:
std::generate(..., ..., [&mygen]() { return mygen.give_rnd(); });