我想保存一个泛型可调用对象及其状态以备后用。请参见下面的示例代码。我可能会使用std::function
或std::bind
来实现此操作,但我不知道哪种方法最好。另外请注意,在下面示例的main()
中,capturedInt
必须保存在可调用对象的状态中。
有哪些可能性:
makeCallable(fun, args...) { ... }
CallableType
template <typename RetT>
class Service
{
public:
template <typename Fn, typename... Args>
Service(Fn&& fun, Args&&... args)
{
m_callable = makeCallable(fun, args...);
}
Run()
{
m_callable();
}
CallableType<RetT> m_callable;
};
// Template deduction guides (C++17)
template <typename Fn, typename... Args>
Service(Fn&& fun, Args&&... args) -> Service<std::invoke_result_t<std::decay_t<Fn>, std::decay_t<Args>...>>;
int main()
{
Service* s = nullptr;
{
int capturedInt = 5;
s = new Service([capturedInt]() { std::cout << capturedInt << std::endl; } );
}
s->Run();
}
3条答案
按热度按时间2wnc66cl1#
我也会使用
std::function
,但将其保留为类的接口,如下所示:然后你明确了存储类的可调用对象的选项,用户可以决定如何将参数绑定到可调用对象本身,这对于std::function来说是很灵活的。
或
.那么就不用担心终身上课引起的时间问题了。
2lpgd9682#
在给定的设置下,
m_callable
的唯一选项是std::function
,因为函子的类型是构造函数本身的参数,所以必须对函子执行类型擦除操作以保存它供将来使用--而std::function
正是实现这一点的一种机制。因此,
m_callable
将为:您可以将其设置为:
3zwtqj6y3#
除了
std::function<>
和std::bind
之外,还有一种叫做continuation passing的模式。代价是,您需要将代码的其余部分 Package 在lambda中: