是否有统一的方法来存储和传递任何可调用的对象?

时间:2014-03-21 13:10:24

标签: c++ function

背景

我有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(),只要我需要一个新对象。这是我感兴趣的技术问题。

1 个答案:

答案 0 :(得分:3)

你可以把成员调用放在lambda中,例如[factory] { return factory.make_object(); }。 std :: function就是这里的解决方案。

绑定成员函数糟糕的问题与你将要处理的结果无关 - 没有可以使用的类或类型可以解决生成可包装函数的问题对象首先。 f(factory.make_object)的语法无法支持任何类型

只需使用lambda来包装成员函数并使用std::function