背景:
我有一个框架
,我在其中处理对象
。到目前为止,我使用默认构造函数在框架中创建了Object
。现在我想介绍一些关于创建对象
的自定义。我认为允许将工厂传递到框架中会很好。我将其称为Provider
,我将在下面解释原因。
我在框架
中唯一期望的是有一个东西表现得像这样
template< typename Provider >
void Framework::make_objects( Provider obj_provider)
{
Object obj = obj_provider();
}
我希望Provider
是任何可调用的东西,并返回一个要传递的Object
。例如:
Factory factory;
framework.make_objects( factory.make_object ); // [1] a Factory method
framework.make_objects( []() { return Object(); } ); // [2] lambda
framework.make_objects( function_that_spits_Object ); // [3] a simple function
我将 Provider
称为提供程序,而不是工厂,因为它更多地只是工厂的一种方法。
问题:
我无法找到一种使用简单前端接口(interface)来传递并可能存储任何类型的可调用对象(具有给定签名)的方法。可能吗?
我尝试过的:
我尝试了 std::function
,并让它工作,但是当我想使用 Factory
提供 Object
时,变得非常难看> 方法因为是重载的,而且是成员方法。所以我需要将工厂实例绑定(bind)到重载的成员方法。可能,但从用户方面来看确实很难看。
我认为类似于一个背景示例的模板可以工作,但如果能够存储和传递Provider
,那就太好了。我不知道应该如何编写模板才能实现这一点。
我知道我可以解决我的背景/原始问题,我可以在Framework
中接受整个Factory
,并编写一个接受std的构造函数::function
并包装它,因此函数类型提供程序将隐式转换为 Factory
。
但是我的问题是,这是否可以实现、接受和存储任何类型的可调用对象,这样我就可以在框架中的任何位置使用 provider()
每当我需要一个新对象。这是我感兴趣的技术问题。
最佳答案
您可以将成员调用放入 lambda 中,例如[工厂] { 返回工厂.make_object(); }
。 std::function 是这里的解决方案。
绑定(bind)成员函数的问题与你要如何处理结果无关——没有任何类或类型可以用来解决生成可包装函数对象的问题。 f(factory.make_object)
的语法不可能支持任何类型。
只需使用 lambda 来包装成员函数并使用 std::function
。
关于c++ - 是否有统一的方式来存储和传递任何可调用对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22559745/