lambda模板的匹配函数

Matching function for lambda template

本文关键字:函数 lambda      更新时间:2023-10-16

我想调用一个接收两个模板的方法,如下代码:

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)&&