推导类型的lambda衰减为函数指针

时间:2019-01-09 06:59:37

标签: c++ templates c++17

所以我制作了这个模板来内联定义函子:

template <typename F, F* f>
struct AsFunctor
{
    template <typename... Args>
    std::invoke_result_t<F, Args...> operator()(Args&&... args) { return f(std::forward<Args>(args)...); }
};

可以这样使用:

std::unique_ptr<char, AsFunctor<void(char*), +[](char* c) {/*STUFF*/}>> p;

很好,除了我不必两次声明函数的类型。有什么办法可以使编译器推断出来?我已经尝试过各种方式的decltype,例如

#define AS_FUNCTOR(lambda) AsFunctor<decltype(+lambda), +lambda>

但是它们都是编译错误,因为lambda不能出现在未评估的上下文中。

1 个答案:

答案 0 :(得分:1)

可以将auto用作函子,然后使用decltype来推断类型。

template <auto F>
struct AsFunctor {
  template <typename... Args>
  std::invoke_result_t<decltype(F), Args...> operator()(Args&&... args) {
    return F(std::forward<Args>(args)...);
  }
};

int main() {
  int i;
  std::unique_ptr<char, AsFunctor<+[](char* c) { /*STUFF*/ }>> p;
}

我不知道上下文,但是通常您不需要任何自定义函子类型(最好立即使用模板,查看STL中的任何示例)或std::function