2

void* にキャストしようとしている次の tr1::function プロトタイプがあります。

typedef std::tr1::function<cv::Mat (const cv::Mat,const void*)> preprocessingFunc;

この関数では、関数の型と関数へのポインタを示す構造を含むベクトルに格納しています。

void ImageGraph::addNode(preprocessingFunc func)
{
    NodeFunction nodeFunction = { typeid(func), (void*)func };
    //nodes.push_back(nodeFunction);
}

私が得るエラー:

ImagePipeline.cpp: メンバー関数 'void IP::ImageGraph::addNode(IP::preprocessingFunc)': ImagePipeline.cpp:32: エラー: タイプ 'IP::preprocessingFunc' からタイプ 'void*' /usr への無効なキャスト/include/c++/4.2.1/typeinfo:135: エラー: 'std::type_info::type_info(const std::type_info&)' はプライベート ImagePipeline.cpp:32: エラー: このコンテキスト内

この関数型をポインター (void*) にキャストすることは可能ですか? そうでない場合、私がやっていることを達成するためのより良い方法はありますか?

わかりやすくするために、後で呼び出す関数ポインターを保存しています。現在、それらは 3 種類の関数ポインターですが、それらをすべて同じベクトルに保存したいと考えています。

4

2 に答える 2

1

基本的に、メンバー関数には隠し引数(「this」ポインター)があるため、メンバー関数へのポインターを関数ポインターに格納することはできません。

2つの解決策があります。実際の「メンバー関数へのポインター」(正しいタイプの関数ポインターが必要)、または関数を静的にして、オブジェクト自体をポインター(たとえば、void)として渡します。

私には、これは一種の奇妙な解決策のように思えます。インターフェイスクラスを使用し、インターフェイスオブジェクトを「ノード」として追加するなど、より良い解決策があると思いますか?

「メンバー関数へのポインター」の詳細については、http: //www.parashift.com/c++-faq/fnptr-vs-memfnptr-types.htmlを参照してください。

しかし、以下のコメントを考えると、実際にはオブジェクトをポインタに格納しようとしています。これは似て(void *)3.1415926;います-意味がありません。ここではおそらくvoid*を使用するべきではありませんが、function<>へのポインター[およびpreprocessingFuncオブジェクトへのポインターを取得するようにaddNodeを変更する]などの他の何かを使用する必要があります。

于 2012-12-22T11:42:22.500 に答える
0

間違った方向からアプローチしているようです。なぜあなたは使用していvoid*ますか?あなたは「現在3種類の関数ポインタ」を持っていると述べています。呼び出し可能なものを保存するには、 を使用しますtr1::function<>。ほとんどの合理的なソースから初期化できます: 関数ポインタ、メンバ関数へのバインドされたポインタ、ファンクタ、および明らかに他tr1::functionの s

于 2012-12-22T13:16:46.480 に答える