lambda模板的匹配函数

时间:2016-07-21 21:49:23

标签: c++ templates c++11 lambda

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

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

如何使用这样的方法?

2 个答案:

答案 0 :(得分:4)

我建议你改变模板参数的顺序,让编译器自动推导出FUNC类型。

template<size_t N, class FUNC>
T Func(FUNC fn) { ... }

并将其命名为

int v = t.Func<3>(l);

答案 1 :(得分:4)

您应该更改模板参数的顺序,以便只需要指定N并且可以推导出FUNC

template <size_T N, class FUNC>
T Func(FUNC&& fn);

t.Func<3>(l);

如果您需要明确指定FUNC,则它应为decltype(l)&,以便参考折叠规则FUNC&&变为decltype(l)&并且可以绑定到左值{{} 1}}。如果您将l指定为FUNC而没有引用,则参数将变为decltype(l),无法绑定到左值。