c++ - 在模板类中使用 lambda

标签 c++ templates c++11 lambda

我正在尝试使用带有 lambda 函数参数的模板类。但是,我不明白如何传递参数。到目前为止,这是我尝试过的:

#include <iostream>
using namespace std;

template <class F>
class A {
public:

   int f(int i)
   {
       return F(i); //*
   }
};

int main(int argc, const char * argv[]) {
auto f = [](int i){return i+5;};
A<decltype(f)> a;
cout << a.f(5);
return 0;
}

我在标记的行中发现错误。

有人可以帮忙吗?

最佳答案

您的示例不起作用,因为 F 是一种类型,而不是可调用对象。下一步是通过创建成员变量来实例化它。

template <class F>
class A {
    F function;
public:
    int f(int i) {
         return function(i);
    }
};

但是,这仍然行不通,因为 lambda 默认构造函数已被删除。这意味着我们需要另一种方式来构造function。这可以通过将参数传递给 A 的构造函数来实现。

template<typename F>
class A {
    F function;
public:
    A(const F& f) : function(f) {}
    int f(int i) {
        return function(i);
    }
};

// ...

auto f = [](int i) { return i+5; };
A<decltype(f)> a(f);

这使用了未删除的 lambda 复制构造函数。

Live example

如果你想让它与任何 lambda 一起工作,你可以添加更多魔法。

template<typename F>
class A {
    F function;

public:
    A(const F& f) : function(f) {}

    template<typename ...Args>
    auto f(Args... args) -> std::result_of_t<F(Args...)> {
        return function(std::forward<Args>(args)...);
    }
};

Live example

关于c++ - 在模板类中使用 lambda,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39308966/

相关文章:

C++ 仅在满足模板类型的条件时才创建类的实例

c++ - 如何从客户端代码中隐藏模板化的非成员函数?

c++ - 如何使用 std::rand 生成非重复的随机数序列

c++ - packaged_task 和 async 有什么区别

c++ - 取消引用 `new` 指针是否被认为是好的风格?

c++ - 将区间[0,1]分成(3j-2)个子区间

c++ - 如何创建一个可以为 T 选择特殊容器的模板类?

c++ - 成员和成员函数的歧义部分模板特化

android - 将cpp类添加到android项目中

c# - 当名称与返回的数据类型相同时,属性会重命名