このシナリオで:キャストSTD関数オブジェクトバックファンクタ構造体への
struct Holder {
std::function<void()> f;
};
struct Functor { void operator()(){ /**/ } };
int main() {
Holder = { Functor{} };
//...
は後でFunctor
型にf
バックをキャストする方法はありますか?
このシナリオで:キャストSTD関数オブジェクトバックファンクタ構造体への
struct Holder {
std::function<void()> f;
};
struct Functor { void operator()(){ /**/ } };
int main() {
Holder = { Functor{} };
//...
は後でFunctor
型にf
バックをキャストする方法はありますか?
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);
}
[デモ](https://ideone.com/7HaQ95) –
は良いアイデアですが、あなたはおそらく、そのビットをハイライトしなければなりません。 AFAIKは、(指し示された)ターゲットインスタンスの所有権を得ていませんが、std関数インスタンスの存続期間中も有効であることが保証されているかどうかを知っていますか? –
@DanielJour:関数オブジェクトを再割り当てまたはスワップすると、保持されているターゲットは確実に失われます。 –
短い答えは次のとおりです。これは、 "タイプ消去"のすべてです。やや長めの答えは「イエス」です: –
@SamVarshavchik主張-S –