2016-02-24 19 views
9

このシナリオで:キャストSTD関数オブジェクトバックファンクタ構造体への

struct Holder { 
    std::function<void()> f; 
}; 
struct Functor { void operator()(){ /**/ } }; 
int main() { 
    Holder = { Functor{} }; 
    //... 

は後でFunctor型にfバックをキャストする方法はありますか?

+0

短い答えは次のとおりです。これは、 "タイプ消去"のすべてです。やや長めの答えは「イエス」です: –

+3

@SamVarshavchik主張-S –

答えて

8

targetメンバ関数はstd::functionのタイプ-unerasingキャストです。ターゲットタイプを知る必要があります:

#include <cassert> 
#include <functional> 

struct Functor { void operator()(){ /**/ } }; 

int main() 
{ 
    std::function<void()> f = Functor(); 
    Functor * p = f.target<Functor>(); 
    assert(p != nullptr); 
} 
+0

[デモ](https://ideone.com/7HaQ95) –

+0

は良いアイデアですが、あなたはおそらく、そのビットをハイライトしなければなりません。 AFAIKは、(指し示された)ターゲットインスタンスの所有権を得ていませんが、std関数インスタンスの存続期間中も有効であることが保証されているかどうかを知っていますか? –

+0

@DanielJour:関数オブジェクトを再割り当てまたはスワップすると、保持されているターゲットは確実に失われます。 –

関連する問題