Передача функции в качестве параметра функции-члену класса - PullRequest
0 голосов
/ 13 апреля 2020

Я пытаюсь добавить функциональность генератора случайных чисел в свой класс, и я хочу сделать это максимально эффективно и кратко. Я использую этот класс для численного моделирования, поэтому я использую mersenne_twister_engine, std::mt19937. Единственный способ, которым я смог успешно реализовать это, - это определить генератор случайных чисел в каждой функции-члене, которая требует функциональности случайных чисел. Однако это решение кажется неоптимальным. Например, в файле. cpp определение функции будет следующим:

void SomeClass::RandomNumberFunction(){
    std::random_device rd;
    std::mt19937 gen(rd());
    std::uniform_real_distribution<> DIS;
    // Generate random number:
    float n = DIS(gen);

    ~~ some code using n ~~

}

Скорость и использование памяти моей программой не имеют значения для моих целей, но я хотел бы знать, есть ли В c ++ есть способ более эффективно реализовать mersenne_twister_engine и дистрибутив. В частности, одной из реализаций, которая кажется выполнимой, является передача указателей на объекты std ::iform_real_distribution <> и std :: mt19937 для каждой функции-члена, которой требуется случайное число, и эти объекты могут быть определены в теле main (). Или лучше, объект std :: bind может быть определен и указатель на него передан соответствующим функциям.

Это не похоже на значительное улучшение, хотя в моей текущей реализации все же.

Что было бы идеально, было бы для std :: random_device, std :: mt19937 и std :: iform_real_distribution <> объекты, которые будут членами класса. Я пытался реализовать это как:

SomeClass.h файл:

class SomeClass(){
private:
    std::random_device rd;  
    std::mt19937 generator(rd()); 
    std::uniform_real_distribution<> distribution(0.0, 1.0); 

public:
   SomeClass();
   ~SomeClass();
   void RandomNumberFunction();
}

SomeClass. cpp файл:

void SomeClass::RandomNumberFunction(){

    float n = distribution(generator);

    ~~ some code using n ~~

}

Но это не работает Я вижу, что включение определения распределения в объявление функции является причиной ошибки, но я не вижу обходного пути.

Возможно ли то, что я пытаюсь сделать, и если это так, это даже необходимо? Стоит ли тратить мое время на то, чтобы сделать реализацию более аккуратной, или первоначальное решение достаточно на практике?

...