gpt4 book ai didi

c++ - 如何返回使用 lambda 模板化的对象?

转载 作者:行者123 更新时间:2023-11-30 01:06:54 26 4
gpt4 key购买 nike

考虑以下代码:

class BaseTask {
// Implementation here
};

class BaseSubtask {
BaseTask *_pTask;
public:
explicit BaseSubtask(BaseTask *pTask) : _pTask(pTask) { }
virtual void Run() = 0;
// The rest of implementation here.
};

template<typename taFunc> class LambdaSubtask {
taFunc _f;
public:
explicit LambdaSubtask(BaseTask *pTask, taFunc&& f)
: BaseSubtask(pTask), _f(std::forward<taFunc>(f))
{ }
LambdaSubtask(const LambdaSubtask&) = delete;
LambdaSubtask& operator=(const LambdaSubtask&) = delete;
LambdaSubtask(LambdaSubtask&&) = delete;
LambdaSubtask& operator=(LambdaSubtask&&) = delete;
virtual void Run() override final { _f(); }
// The rest of implementation here
};

因为我不能声明 LambdaSubtask未指定其模板类型参数的对象,并且我无法指定其模板类型参数,因为它是一个 lambda,我尝试实现一个工厂方法:

template<typename taFunc> inline LambdaSubtask<taFunc>
MakeLambdaSubtask(BaseTask *pTask, taFunc&& f) {
return { pTask, std::forward<taFunc>(f) };
}

不幸的是,这会产生编译错误:

copy-list-initialization of LambdaSubtask<lambda_...> cannot use an explicit constructor

通过适当的工厂方法,我可以获得 LambdaSubtask对象如下:

BaseTask task; // Initialization of the task is skipped in the example
auto&& lst = MakeLambdaSubtask(&task, [/* Capture here*/]() {
// Implementation here
});

所以基本上我想要一个 LambdaSubtask 的局部变量对象类型,模板类型是 lambda。我想避免额外复制任何东西。我当然想避免 std::function正如我的基准测试所示,它非常慢。

你知道如何实现一个合适的工厂方法或获取LambdaSubtask的局部变量对象吗?以其他方式输入?

我的编译器是带有工具集 v141 的 MSVC++2017,因此部分支持 C++11/14/17。

最佳答案

您通过显式声明您的 lambda 构造函数来自行完成此操作。删除显式,您的代码应该可以编译。

请记住,统一列表初始化不适用于显式构造函数。

关于c++ - 如何返回使用 lambda 模板化的对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45423656/

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