将std :: normal_distribution绑定到std :: function以存储在std :: vector中

时间:2017-05-16 21:03:57

标签: c++ c++11 templates std

我试图将几种不同类型的c ++发行版存储到一个容器中,我想我可以使用std :: function来达到这个目的。我这样做的尝试如下:

void print_rand(){
    // Make the random number generator
    std::random_device rd{};
    std::mt19937 engine(rd());

    // Store the distribution in a std::function
    auto n1 = std::make_shared<std::normal_distribution<double>>(0,1);
    std::function<double (std::mt19937)>  fn = std::bind(&std::normal_distribution<double>::operator(), n1, std::placeholders::_1);

    // Call the function to get a normally distributed number
    std::cerr << fn(engine) << std::endl;
}

但是我收到以下错误:

error: no matching function for call to ‘bind(<unresolved overloaded function type>, std::shared_ptr<std::normal_distribution<double> >&, const std::_Placeholder<1>&)’
     std::function<double (std::mt19937)>  fn = std::bind(&std::normal_distribution<double>::operator(), n1, std::placeholders::_1);

当我尝试模板专门化operator()时,调用如:

std::function<double (std::mt19937)>  fn = std::bind(&std::normal_distribution<double>::operator()<std::mt19937>, n1, std::placeholders::_1);

我得到了同样的错误。

任何提示都会非常感激!

1 个答案:

答案 0 :(得分:3)

以下是将normal_distribution放入std::function

的方式
std::normal_distribution<double> nd(0, 1);
std::function<double(std::mt19937&)> fn = nd;

shared_ptr,没有bind,没有lambda,没有复制随机数引擎(请注意&)。