部分的に修飾された関数オブジェクトを別のスレッドで後で呼び出すことに問題があります。ポインタへのポインタとオブジェクトへのポインタの意味
GCCでは、マクロとtypedefを使用していますが、私は警告をクリアしようとしています。
「警告:条件付きサポートされているポインタ関数へのポインタとオブジェクト間のキャスト」の結果、以下のようなFunction_Castマクロ使用#define Function_Cast(func_ref) (SubscriptionFunction*) func_ref
typedef void(SubscriptionFunction(void*, std::shared_ptr<void>));
を私は本当に必要なのはポインタであります私は標準を作ることができる::バインド<function_type>のオブジェクトです。これは通常どのように行われますか?
また、この条件付きでサポートされているものは本当に面倒です。私はx86上で私のコードがうまく動作することを知っていると私はこのsizeof(void *)== sizeof(this *)に依存することの限界を認識しています*。
また、コードがコンパイルされるようにデータポインタのような関数ポインタを扱う方法がありますか?私はそれがいかに悪いかを知ることに興味があります(もしそうであれば)。
関連するコードは:
#define Function_Cast(func_ref) (SubscriptionFunction*) func_ref
typedef void(SubscriptionFunction(void*, std::shared_ptr<void>));
typedef void(CallTypeFunction(std::shared_ptr<void>));
Subscriber(void* owner, SubscriptionFunction* func, bool serialized = true) {
this->_owner = owner;
this->_serialized = serialized;
this->method = func;
call = std::bind(&Subscriber::_std_call, this, std::placeholders::_1);
}
void _std_call(std::shared_ptr<void> arg) { method(_owner, arg); }
非静的メンバ関数は、(メンバでない)関数への通常のポインタとして使用することはできません。あなたはC++ 11を持っていますが、['std :: function'](http://en.cppreference.com/w/cpp/utility/functional/function)と[' std :: bind'](http ://en.cppreference.com/w/cpp/utility/functional/bind)? –
...またはlambdas? – lorro
@JoachimPileborg私はstd :: functionを最初に使用しようとしましたが、これは主に名前のためですが、 'std :: function'を 'std ::関数 'を呼び出すことで、同じ構造体にたくさん格納することができました。この変換に答えることも、その質問に対する答えになります。 –