使用auto来获得具有boost :: random的分布函数

时间:2013-01-31 16:40:12

标签: c++ boost random functional-programming

我正在尝试创建一个元组,其中我将有一个带有生成器并返回double的函数。

我仍然难以实现它。

到目前为止,我正在尝试制作这样一条线:

    auto g = boost::random::uniform_real_distribution<>().operator()<boost::random::mt19937>;

理想情况下使用

#include <boost/random.hpp>

main()
{
    //I want to see all boost distribution as std::function<double(boost::random::mt19937)>
    auto g = boost::random::uniform_real_distribution<>().operator()<boost::random::mt19937>;
    boost::random::mt19937 f(0);
    double x = g(f);
}

我遗漏了一些东西(当然是operator()是模板化的事实)但我不明白为什么它不能在auto上编译。

1 个答案:

答案 0 :(得分:0)

您的表达式首先创建一个临时(boost::random::uniform_real_distribution<>()),然后使用.表示法。编译器将其解释为尝试访问成员或在该临时函数上调用函数(在您的情况下函数为operator ())。但是,函数调用缺少参数和括号,这在语法上是非法的。这就是它不能编译的原因。

无论如何,如果我理解你正在尝试做什么,你基本上想要一个封装另一个对象operator ()的仿函数。但是,我不明白为什么你需要一个。如果你首先有一个仿函数,比如boost::random::uniform_real_distribution<>,那么另一个只包裹它operator ()的仿函数是没有意义的。

为什么你不能这样做?

boost::random::uniform_real_distribution<> g;    
boost::random::mt19937 f(0);
double x = g(f);