gpt4 book ai didi

c++ - 使构造函数适应工厂要求

转载 作者:行者123 更新时间:2023-11-28 04:08:25 25 4
gpt4 key购买 nike

我正在从我无法控制的基类派生类。该类将由我传入的工厂函数指针创建(在我也无法控制的部分代码中)。

在我的派生类中,我需要将一个额外的构造函数参数传递给工厂函数。

我的第一个尝试是尝试通过 lambda 调整工厂函数,但这无法捕获额外的参数。其他答案解释了为什么这不起作用。接下来我尝试用 std::function 来增强它,其他答案让我相信会起作用,但我无法找出正确的语法并且发现示例难以理解(并且不确定我是否真的理解它在做什么)。

我在这里做错了什么?有没有更好的方法来解决这个问题?

演示代码:

#include <functional>
#include <string>

// I have no control over this
struct Base {
Base(int i) {}
};

void UseObject(Base *(*factory)(int i)) {
Base *instance = factory(5);
// Save created instance
}

// I control the rest
struct Derived : public Base {
Derived(const char *s, int i) : Base(i) { /* Store s for later use */ }

static Base *Factory(const char *s, int i) { return new Derived(s, i); }
};

void AddObject(const char *name)
{
// First stab
// UseObject([name] (int i) { return Derived::Factory(name, i); });

// Second stab
std::function<Base *(int i)> foo { [name] (int i) { return Derived::Factory(name, i); } };
UseObject(foo);
}

int main(int ac, char **av)
{
AddObject("some_name");
AddObject("another_name");
return 0;
}

我从 g++ (7.4.0) 得到的错误是:

tfunc.cpp: In function ‘void AddObject(const char*)’:
tfunc.cpp:28:18: error: cannot convert ‘std::function<Base*(int)>’ to ‘Base* (*)(int)’ for argument ‘1’ to ‘void UseObject(Base* (*)(int))’
UseObject(foo);

最佳答案

UseObject 不允许非捕获 lambda 或 std::function 或常规类仿函数。它接受的唯一可调用函数指针(非捕获 lambda 可以转换为)。

所以你可能会这样做:

UseObject([](int i) { return Derived::Factory("some_name", i); });

但不是

auto name = "some_name";
UseObject([name] (int i) { return Derived::Factory(name, i); });

可能(有限)的解决方法是使用全局变量来存储状态。 (所以不能同时使用)。

void AddObject(const char *name)
{
// global usage as UseObject only accepts pointer function
static const char* instance = nullptr;

instance = name;
UseObject(+[](int i) { return Derived::Factory(instance, i); });
}

关于c++ - 使构造函数适应工厂要求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58295100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com