c++ - 将 lambda 推导为 std::function<T>

标签 c++ templates lambda std-function

我实际上是在尝试拥有它,这样我就可以从任何带捕获的兰巴舞创建一个通用回调:GenericCallback([=]{});

使用下面的类:

template<typename T> class GenericCallback : public Callback {
public:
    GenericCallback(const std::function<T>& f) {
        mFunction = f;
    }

    void Call() override {
        mFunction();
    }

    std::function<T> mFunction;
};

问题是它希望我定义模板参数。一般来说,这样做没有问题,但如果我使用任何捕获,无论是使用 [=] 还是特定参数,我都无法将类型插入此结构。

我的最终目标是稍后在特定条件下简单地调用这些函数。

出现此错误的情况:

int v = 5;
GenericCallback<void()>([=]{ int x = v; });

最佳答案

您误解了 std::function<> 的整个概念并使问题过于复杂。您可以使用 std::function<void()>在这种情况下,并绑定(bind)与它匹配的任何内容,您需要更改 <> 中的类型仅当您需要更改调用签名时。所以

class Callback {
public:
    using callback_type = std::function<void()>;

    Callback( callback_type cb ) : m_cb( cb ) {}
    void call() { m_cb(); }

private:
    callback_type m_cb;
};

int main()
{
    int v;
    Callback c( [=]{ int x = v; } );
    c.call();
}

会很简单,你不需要那里的模板。您需要在 std::function 中更改类型在这种情况下,只有当你想要 Callback::call()将某些内容传递给该回调或使其返回某些内容,我怀疑您打算这样做。

live example

关于c++ - 将 lambda 推导为 std::function<T>,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47599764/

相关文章:

c++ - 如何在 MFC 应用程序退出时设置错误级别

c++ - 指向模板类实例的指针 vector

Java流根据double值对对象进行排序

java - 在 Java 中列出 mongoDB 的数据库时对 forEach 的引用不明确

c++ - 具有函数类型参数的模板导致编译器错误

c++ - lambda 应该能够看到本地类吗?

android - Android NDK 的 gettid 和 pthread_self 之间的区别?

c++ - 警告 : No Previous Declaration - C++

c++ - 从 QTableView 中检索特定列的内容

c++ - 在 C/C++ 中返回指向类/结构中任何字段的指针