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

标签 c++ function

背景:

我有一个框架,我在其中处理对象。到目前为止,我使用默认构造函数在框架中创建了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/

相关文章:

c++ - 在我的函数中删除对 boost::bind 的需要

php - 在 PHP5 中运行 PHP7 的代码有哪些替代方案

javascript - 从单选按钮发送值

c++ - std::regex——是否有一些需要链接的库?

c++ - 在不指定字符串长度的情况下使用 sprintf_s 使 C++ 应用程序崩溃

c++ - 使用 netUserAdd 函数创建 Windows 用户配置文件

javascript - 是否可以使用从 .onclick 事件函数获得的变量,并在所述事件之外、代码的另一部分中使用它?

不支持 C++ 绑定(bind) UDP 套接字地址系列

c++ - 带有参数 C++ 的 void 函数指针 vector

c - 为什么 gcc 为用户级和内核级代码产生不同的汇编结果