gpt4 book ai didi

c++ - 如何转换类型删除的 std::function?

转载 作者:行者123 更新时间:2023-12-02 10:08:00 26 4
gpt4 key购买 nike

我需要实现可观察对象,当某些值发生变化时通知观察者。
一些观察者不需要知道这个值。一些观察者是类型删除的,但有反射元数据来解释 void* 和读取数据。一些观察者使用类型安全的接口(interface)。

为了支持各种观察者,我将所有内容都存储在 std::function<void(void*)> 中.
但这需要额外的间接层(额外的 std::function )才能从类型删除转换为类型安全接口(interface):

template<typename T> 
struct observable {
std::vector<std::function<void(void *)>> funcs;

void add_observer(std::function<void(void *)> &&f)
{
funcs.emplace_back(f);
}

void add_observer(std::function<void(T&)> &&f)
{
// extra layer of indirection
add_observer([f](void * val)
{
f(*reinterpret_cast<T*>(val));
});
}

void notify(T& new_val)
{
for (const& f : funcs) { f(&new_val); }
}
};

可以投 function<void(void*)>function<void(T&)>避免这种低效率?

最佳答案

将可调用的观察者直接存储而不是 std::function .然后你可以避免双重- std::function间接(假设调用者尚未提供 std::function 作为 add_observer 的参数):

template<typename F>
void add_observer(F &&f)
{
funcs.emplace_back([f=std::forward<F>(f)](void * val) mutable
{
f(*static_cast<T*>(val));
});
}

请注意,如果可调用对象具有较大的状态,则将可调用对象转发到 lambda 可能会更高效,并且还要注意 static_cast足以转换 void*到另一个对象指针类型。
std::function 的混凝土浇注您要求的不存在。它需要 std::functionvoid* 的预期语义做出假设-> T&这一点都不明显。

关于c++ - 如何转换类型删除的 std::function?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59221291/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com