2017-04-07 15 views
-3

私はしばらくオンラインを見てきましたが、問題のようなものは何も見つかりませんでした。私はこの事は、定義されたクラスを使用しています:C/C++でtypedef関数をパラメータとして渡す方法

typedef bool ProgressCallback(double progress); 

ので、同じようにこれを使用する関数が、その後がある:

私はこの関数を呼び出すことが出来るのですか正確に
// The documentation says that it will call progress_callback() 
// during the write where the progress parameter = percentage complete 
void WriteToFile(char* filename, ProgressCallback* progress_callback) 

?これは主にtypedefの構文であり、私を捨ててしまいます。なぜなら、通常はパラメータとして関数を渡すことは困難ではないからです。私は何を試みたのですか:

// Apparently I can't just say "Progress Callback MyCallback{}" 
// Since it gives me "function type may not come from a typedef" error 
bool MyCallbackFunction(double progress){ 
    return true; 
} 

void OtherFunction(){ 

    // Can't assign. I get "a value type of bool (*)(double progress)" cannot be 
    // used to initalize an entity of type ProgressCallback*" error. 
    ProgressCallback* myfunction = MyCallbackFunction; 
    WriteToFile("Test.txt", myfunction); 
} 

明らかに私はこれを間違ってやっています。しかし、これは私が得た最も近いものです。私はWriteToFile()にその引数をどのように渡すべきなのか全く分かりません。

ご協力いただければ幸いです!

+1

Cにはクラスがありません。 – melpomene

+0

typedefは型のエイリアスとして識別子を宣言するだけです。この場合、その型は特定の関数型であり、その型の関数へのポインタを渡しています。ポインターを逆参照して関数指定子を取得し、関数呼び出し式を '(* progress_callback)(0.5)'とすることで、指さし関数を呼び出すことができます。 –

+1

[再生できません](http://coliru.stacked-crooked.com/a/cfb3cb3a017f5269) [mcve]を入力してください。 – Angew

答えて

1

を使用することができます!これを行うための呼び出し規約を明示的に宣言する必要がありました。

bool MyCallbackFunction(double progress){ 
    return true; 
} 

bool __stdcall MyCallbackFunction(double progress){ 
    return true; 
} 

に、今、それを受け入れているようだ:だから私が変更されました。

2

ProgressCallbackを定義するために使用

typedef bool (*ProgressCallback)(double progress); 

その後、あなたは解決

ProgressCallback myfunction = MyCallbackFunction; 
WriteToFile("Test.txt", myfunction); 
+0

私はそれをしたいと思っていますが、それは私のライブラリではありませんので、私は彼らが私に与えたものに固執しています。 – AnotherProgrammer

関連する問題