【问题标题】:Deduce type of lambda decayed to function pointer推断衰减到函数指针的 lambda 类型
【发布时间】:2019-01-09 06:59:37
【问题描述】:

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

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>

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

【问题讨论】:

标签: c++ templates c++17


【解决方案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

【讨论】:

  • 查看有关问题的 cmets。尤其是那些比你的答案更老的人。
猜你喜欢
  • 1970-01-01
  • 2014-04-13
  • 2011-11-14
  • 1970-01-01
  • 2021-12-01
相关资源
最近更新 更多