В моем программировании мне нужно создать определяемые пользователем количество ублас векторов. Я хотел бы сделать это с
«Станд :: генерировать». Однако я получаю ошибки компилятора, которые делают это невозможным для меня.
Код, который я использую, это:
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», см. Вот. Мне нужно, чтобы числа были нормально распределены, поэтому вызов функции для функции распределения должен содержать в качестве аргумента генератор случайных чисел. Поскольку он не позволял мне вызывать это с аргументом, мне пришлось написать класс, чтобы сделать это для меня.
Класс, который я написал, это:
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::*)()’
Я понятия не имею, что компилятор хочет, чтобы я делал здесь, или почему у него столько проблем с этим вообще. Любой совет очень ценится.
Вам нужно передать вызываемый объект. То есть либо указатель на функцию (не указатель на функцию-член, что mygen.give_rnd
есть) или объект класса, который перегружает operator()
, Вы можете просто изменить свою функцию give_rnd
к этому:
double operator()() { return (double) norm_dist(generator); }
А потом просто передайте свой объект непосредственно std::generate
std::generate(..., ..., mygen);
Если по какой-то причине вы хотели сохранить RandGen
класс как таковой, вам нужно будет обернуть его в другой функтор или лямбду:
std::generate(..., ..., [&mygen]() { return mygen.give_rnd(); });
Других решений пока нет …