2016-05-05 15 views
1

boost::anyに格納されている関数ポインタを関数ポインタにキャストしようとしています。boost :: anyはキャストできませんstd :: function

void foo(int, int) {} 

template<typename T, typename... Ts> 
void bar(T func, Ts... args) 
{ 
    boost::any any = func; 

    boost::any_cast<std::function<void(Ts...)>>(any)(args...); 
} 

しかしboost::any_castboost::bad_any_castをスローしますが、なぜ、種類が同一であるので、私は考えています。

bar(foo, 0, 1); 

を次のように私はbarを呼び出しています、私は何かが足りないのですか?

+5

_なぜ型が同じであるのかは分かりません。_それらについては何が同じですか? –

答えて

8

boost::anyをキャストするときは、正確に同じタイプにキャストバックする必要があります。 void (*)(int, int)を保存してstd::function<void(int, int)>にキャストすることはできません。

保存するアイテムやキャストするアイテムを変更して、一致するようにすることができます。

+0

何らかの理由で私は彼らは同じだったが、私は彼らが技術的には同じだと思う。*ありがとう – Rakete1111

+3

@ Rakete1111彼らは技術的に非常に異なっている。彼らはあなたの頭の中で似ているかもしれませんが、それは数えられません。 – sehe

+0

@ Rakete1111本当にそうだと思いますか? function pointer analogを持たない 'std :: function'の使用例については、[here](http://pastebin.com/r1qdEWPe)をチェックしてください。' struct'に 'operator()'を付けてください。 'std :: bind'の使用は別の例です。 'std :: function'は、関数ポインタのようなものでもそうでなくてもよい、呼び出し可能なものを表します。 –

関連する問題