背景
我有Framework
我在Object
处工作。到目前为止,我使用默认构造函数在框架中创建了Object
。现在我想介绍一些关于创建Object
的自定义。我决定允许将工厂传入Framework
会很好。我称之为Provider
,我将在下面解释原因。
我在Framework
中唯一期望的是拥有一个的东西,其行为将是这样的
template< typename Provider >
void Framework::make_objects( Provider obj_provider)
{
Object obj = obj_provider();
}
我希望Provider
成为可调用的任何内容,并返回要传递的Object
。 E.g:
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
为提供者,而非工厂,因为它不仅仅是工厂的方法。
问题:
我无法找到一种简单的前端界面来传递并可能存储任何类型的可调用对象(具有给定签名)的方法。有可能吗?
我尝试了什么:
我尝试了std::function
并让它发挥作用,但是当我想使用Object
方法提供Factory
因为它已经过载以及成员方法时,它变得非常难看。所以我需要将factory
实例绑定到重载的成员方法。从用户方面可能但非常难看。
我认为类似于一个Background示例的模板会起作用,但能够存储和传递Provider
会非常好。而且我无法弄清楚应该如何编写模板来实现这一点。
我知道我可以解决我的背景/原始问题,我可以接受Factory
中的整个Framework
,并编写一个接受std::function
的构造函数并将其包装,所以函数类型提供程序将隐式转换为Factory
。
但是我的问题是,这可以实现,接受和存储任何类型的可调用对象,所以我只需要在框架中的任何位置使用provider()
,只要我需要一个新对象。这是我感兴趣的技术问题。
答案 0 :(得分:3)
你可以把成员调用放在lambda中,例如[factory] { return factory.make_object(); }
。 std :: function就是这里的解决方案。
绑定成员函数糟糕的问题与你将要处理的结果无关 - 没有可以使用的类或类型可以解决生成可包装函数的问题对象首先。 f(factory.make_object)
的语法无法支持任何类型。
只需使用lambda来包装成员函数并使用std::function
。