1

やあ@すべて、次の関数呼び出しを実現する必要があります。

std::mt19937 engine;
color_table lut = create_random_color_map(engine);



エンジンは交換可能でなければなりません。次のように実装しようとしました:
*.hpp

#include <tuple>
#include <random>

typedef std::tuple<unsigned char,unsigned char,unsigned char> rgb_tuple;

class color_table{
    public:
        [...]
        void generate(rgb_tuple predicate(const unsigned char& index));





 };
template <class RANDOM>
static rgb_tuple random_color(RANDOM engine){
    std::uniform_int_distribution<int> dist1 (0,255);
    unsigned char red   = (unsigned char) dist1();
    unsigned char green = (unsigned char) dist1(engine);
    unsigned char blue  = (unsigned char) dist1(engine);
    return std::make_tuple(red, green, blue);
}

template <class RANDOM>
static color_table create_random_color_map(RANDOM engine){
    color_table lut;
    lut.generate([&](const unsigned char& i)->rgb_tuple {
        return random_color<decltype(engine)>(engine);
    } );
    return lut;
}

* .cpp

...
void color_table::generate(rgb_tuple predicate(const unsigned char& index)){
    for(int i = 0; i < 256; ++i){
        std::tie(red_table[i], green_table[i], blue_table[i]) = predicate(i);
    }
}

コンパイルしようとすると、次のエラーが発生します。

エラー C2664: 'color_table::generate': 'create_random_color_map::' から 'rgb_tuple (__cdecl *)(const unsigned char &)' へのパラメーター 1 の
変換はできませんオペレーターを呼び出すことができません。... 関数テンプレート「color_table create_random_color_map(RANDOM)」。[
RANDOM=std::mt19937 ]で

私たちはその失敗についてまったく無知であり、その場合、グーグルは私たちの友人ではありません! :/

どんな助けにも感謝します!

よろしく ヒュミル

4

2 に答える 2

0

問題はあなたのことだと思います:

void generate(rgb_tuple predicate(const unsigned char& index));

次のようにする必要があります。

void generate(rgb_tuple (*predicate)(const unsigned char& index));

関数を渡すことはできません! 関数への単なるポインタ。

しかし悲しいかな!ラムダは、空のキャプチャ セットがある場合にのみ関数へのポインタに変換できますが、ラムダはそうではありません。

だからあなたは試すことができますstd::function

void generate(std::function<rgb_tuple(const unsigned char& index)> predicate);

PS:少し説明が必要です...エラーメッセージは次のとおりです。

パラメータ 1 を「create_random_color_map::」から「rgb_tuple (__cdecl *)(const unsigned char &)」に変換できません

最初の部分create_random_color_map::は、変換しようとしているオブジェクトの型がわからないことを伝える VC++ の方法ですが、それは にローカルなものですcreate_random_color_map: それは明らかにラムダ自体です。

2 番目の部分rgb_tuple (__cdecl *)(const unsigned char &)は、適切な型の関数へのポインタです。

そして、エラーは、最初のものを後者に変換できないことを示しています。

于 2013-05-21T23:16:18.130 に答える