自动变量以存储指向std :: max的函数指针

eXX*_*XX2 3 c++ templates auto template-argument-deduction

我正在尝试将函数std::max作为模板参数传递给模板化函数,但是由于某些原因,编译器会打印出无法推断出函数类型的错误。一个简单的例子也重现了同样的问题。它具有自己的max2功能,但不适用于STL std::max

#include <algorithm>

template <class T>
T max2(const T& a, const T& b) { return std::max(a, b); }

int main() {
#if 1
  auto f = max2<float>;
#else
  // error: unable to deduce ‘auto’ from ‘max<float>’
  auto f = std::max<float>;
#endif
  float max_val = f(1.0f, 2.0f);
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

chr*_*ris 7

正如所看到这里std::max<float>是不是一个单一的,明确的功能。至此,这是一个过载设置,仍然有两种可能性:

constexpr const float& max( const float& a, const float& b );
constexpr float max( std::initializer_list<float> ilist );
Run Code Online (Sandbox Code Playgroud)

您有两个主要选择:

  1. 强制转换为适当的类型:

    auto f = static_cast<const float&(*)(const float&, const float&)>(std::max);
    
    Run Code Online (Sandbox Code Playgroud)
  2. 将其包装在lambda中:

    auto f = [](float a, float b) { return std::max(a, b); };
    // Note there's no by-reference behaviour in this lambda.
    
    Run Code Online (Sandbox Code Playgroud)

预计将来您会做得更好。今天,您今天可以使用宏来模仿这样的事情(最简单的方法是将宏扩展为lambda来完成)。我遇到了至少一个LIFT执行此操作的宏。