0

内部にジェネレーターを取り、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 でコンパイルされない理由がわかりません。

4

1 に答える 1

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);
于 2013-01-31T17:54:18.513 に答える