Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/143.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何使用捕获实现lambda的包装器?_C++_C++11_Lambda - Fatal编程技术网

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
}