C++ 如何使用捕获实现lambda的包装器?
C++ 如何使用捕获实现lambda的包装器?,c++,c++11,lambda,C++,C++11,Lambda,std::function可以用捕获列表包装lambda,但是如何实现std::function?我们不知道它是什么类型的,它可以被分配到void*,但是不可能调用lambda免责声明:这是不完整的,可能不正确的,并且不符合std::functionapi和约定(例如,它不可复制)。这只是一个示例,展示了如何实现类std::function类型的类型擦除的一种方法,将其拆分到最低限度以了解类型擦除技术 为了存储任何类型并能够根据函数签名调用它,我们使用多态性 这是定义调用API的签名的基本抽象类
std::function
可以用捕获列表包装lambda,但是如何实现std::function
?我们不知道它是什么类型的,它可以被分配到void*
,但是不可能调用lambda免责声明:这是不完整的,可能不正确的,并且不符合std::function
api和约定(例如,它不可复制)。这只是一个示例,展示了如何实现类std::function
类型的类型擦除的一种方法,将其拆分到最低限度以了解类型擦除技术
为了存储任何类型并能够根据函数签名调用它,我们使用多态性
这是定义调用API的签名的基本抽象类<代码>签名必须是函数类型:
template <class Signature> struct CallableBase;
template <class R, class... Args>
struct CallableBase<R(Args...)>
{
virtual R call(Args... args) = 0;
};
在我们的函数
类中,我们持有一个类型为CallableBase
的指针,指向类型为Callable
的对象,以启用多态性并获得所需的行为:
template <class Signature> struct Func;
template <class R, class... Args>
struct Func<R(Args...)>
{
using Signature = R(Args...);
std::unique_ptr<CallableBase<Signature>> callable_;
template <class F>
Func(F f) : callable_{std::make_unique<Callable<F, Signature>>(f)} {}
R operator()(Args... args)
{
return callable_->call(args...);
}
};
你看过libstdc++和libc++中的实现了吗?@StephenNewell说,库简直是一团糟
template <class Signature> struct Func;
template <class R, class... Args>
struct Func<R(Args...)>
{
using Signature = R(Args...);
std::unique_ptr<CallableBase<Signature>> callable_;
template <class F>
Func(F f) : callable_{std::make_unique<Callable<F, Signature>>(f)} {}
R operator()(Args... args)
{
return callable_->call(args...);
}
};
auto test()
{
int x = 10;
Func<int(int, int)> f = [=] (int a, int b) { return a * x + b; };
return f(2, 5); // 25
}