Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/go/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 用于存储指向std::max的函数指针的自动变量_C++_Templates_Auto_Template Argument Deduction - Fatal编程技术网

C++ 用于存储指向std::max的函数指针的自动变量

C++ 用于存储指向std::max的函数指针的自动变量,c++,templates,auto,template-argument-deduction,C++,Templates,Auto,Template Argument Deduction,我试图将函数std::max作为模板参数传递给模板化函数,但由于某些原因,编译器打印出无法推断函数类型的错误。一个简单的例子再现了同样的问题。它可以使用自己的max2函数,但不能使用STLstd::max: #include <algorithm> template <class T> T max2(const T& a, const T& b) { return std::max(a, b); } int main() { #if 1 auto

我试图将函数
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;
}
#包括
模板
tmax2(常数T&a,常数T&b){return std::max(a,b);}
int main(){
#如果1
自动f=max2;
#否则
//错误:无法从“最大值”推断“自动”
自动f=标准::最大值;
#恩迪夫
浮动最大值=f(1.0f,2.0f);
返回0;
}
正如所见,
std::max
不是一个单一的、明确的函数。在这一点上,它是一个重载集,仍然有两种可能性:

constexpr const float& max( const float& a, const float& b );
constexpr float max( std::initializer_list<float> ilist );
在未来,人们期望你能做得更好。今天,您可以使用宏来模拟这样的事情(最简单的方法是将宏扩展为lambda)。我至少遇到过一个执行此操作的
LIFT
宏。

有多个模板重载;您可以使用来指定应使用哪一个

static\u cast
还可以通过执行函数到指针到特定类型的转换来消除函数重载的歧义

e、 g

auto f=static_cast(标准::最大值);

问题在于,编译器不知道您想要哪一个。我个人更喜欢模板函数的样式,即创建一个(非模板)类,并给它一个模板函数调用运算符(可能有多个具有不同签名的运算符),然后传递该类的对象。然后您甚至不必指定模板参数。您可以只传递
max
,而不是
max
,或者更糟糕的是,当您有多个自由函数重载时,需要进行令人讨厌的静态强制转换。库对其所有功能都执行此操作。
auto f = static_cast<const float&(*)(const float&, const float&)>(std::max);
auto f = [](float a, float b) { return std::max(a, b); };
// Note there's no by-reference behaviour in this lambda.
auto f = static_cast<const float& (*)(const float&, const float&)>(std::max<float>);