gpt4 book ai didi

C++ 闭包和 std::function

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:27:41 27 4
gpt4 key购买 nike

我正在尝试弄清楚 std::function 与闭包结合使用时发生了什么。我还不能全神贯注,例如:正在调用什么构造函数?任何人都可以发布一个工作示例来替换 std::function 以支持以下示例中所需的功能吗?

#include <functional>

int main(int argc, char* argv[])
{
int mybool = 5;

auto foo = [&] (int arg) {
return mybool * arg;
};

std::function<int(int)> foo2 = foo;

int result = foo2(42);

return 0;
}

最佳答案

这是最简单的例子:

template <class F>
struct Decomposer;

template <class R, class A>
struct Decomposer<R (A)>
{
typedef R return_type;
typedef A argument_type;
};


template <class F>
struct my_function
{
typedef typename Decomposer<F>::return_type return_type;
typedef typename Decomposer<F>::argument_type argument_type;

return_type operator() (argument_type arg) const {
return (*impl)(arg);
}

template <class From>
my_function(From &&from)
{
struct ConcreteImpl : Impl
{
typename std::remove_reference<From>::type functor;
ConcreteImpl(From &&functor) : functor(std::forward<From>(functor)) {}
virtual return_type operator() (argument_type arg) const override
{
return functor(arg);
}
};
impl.reset(new ConcreteImpl(std::forward<From>(from)));
}

private:
struct Impl {
virtual ~Impl() {}
virtual return_type operator() (argument_type arg) const = 0;
};

std::unique_ptr<Impl> impl;
};

核心思想是使用类型删除来存储实际的闭包而不知道其类型:参见虚拟Impl::operator() 和本地定义的类型-具体持有人 ConcreteImpl.

Live example

关于C++ 闭包和 std::function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19422547/

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