lambda模板的匹配函数
Matching function for lambda template
我想调用一个接收两个模板的方法,如下代码:
template<class T>
class Test {
T t;
public:
Test(T v):t(v){}
template<class FUNC, size_t N>
T Func(FUNC&& fn) {
T v = 0;
for (size_t i = 0; i < N; i++)
v += fn(i);
return v;
}
};
int main(int argc, char **argv) {
Test<int> t(2);
auto l = [](size_t i) {return 2*i;};
int v = t.Func<decltype(l), 3>(l);
return 0;
}
但我得到了这个错误:
no matching function for call to ‘Test<int>::Func(main(int, char**)::<lambda(size_t)>&)’
int v = t.Func<decltype(l), 3>(l);
如何使用这样的方法?
我建议您更改模板参数的顺序,并让编译器自动推导FUNC
类型。
像
template<size_t N, class FUNC>
T Func(FUNC fn) { ... }
并称之为
int v = t.Func<3>(l);
您应该更改模板参数的顺序,这样只需要指定N
,就可以推导出FUNC
:
template <size_T N, class FUNC>
T Func(FUNC&& fn);
t.Func<3>(l);
如果需要显式指定FUNC
,它应该是decltype(l)&
,这样通过引用折叠规则,FUNC&&
就变成了decltype(l)&
,并且可以绑定到左值l
。如果将FUNC
指定为没有引用的decltype(l)
,则参数将变为无法绑定到左值的decltype(l)&&
。
相关文章:
- 可组合的lambda/std::函数与std::可选
- C++Boost Asio Pool线程,带有lambda函数和传递引用变量
- 如何建立使用模板函数的lambda函数的尾部返回类型
- 如何将lambda作为模板类的成员函数参数
- 我可以将调用类的"this"传递给 lambda 函数吗?
- 模板函数指针和lambda
- 两组使用lambda函数的大括号
- 尝试将lambda函数放在队列中时出现一般分配器错误(可能是与unique_ptr有关的错误)
- 我可以在这里替换什么,因为我不能在 C# 中使用隐式变量的 lambda 函数?
- 在构造函数中使用 lambda 的 C++ 类
- 如何调用存储在指向"std::函数"的指针中的 lambda?
- 为什么我不能在 constexpr lambda 函数中使用 std::tuple
- 从具有按值捕获的 lambda 移动构造 std::函数时,移动构造函数调用两次
- C++:Lambda 函数指针转换的用例是什么?
- 将有状态的 lambda 传递到 C 样式函数中,而无需上下文参数
- std::映射服装比较函数和函数/lambda错误
- 在可移动类型的构造函数 lambda 中捕获此内容的安全使用
- 排序测试模板化函数 lambda:非法使用此类型作为表达式
- 将匿名函数(lambda)保存为函数类型变量
- 如何编写将自身作为回调传递的匿名函数/lambda