我试图将函数index %_2016 %_2017
W11 0 40.0
W12 2.5 19.0
W13 43.0 6.0
W14 63.0 17.0
W15 1.0 0
作为模板参数传递给模板化函数,但由于某些原因,编译器会输出无法推导出函数类型的错误。一个简单的例子再现了同样的问题。它适用于自己的std::max
函数,但不适用于STL max2
:
std::max
答案 0 :(得分:4)
如here所示,std::max<float>
不是单一,明确的功能。此时,它是一个过载集,仍有两种可能性:
constexpr const float& max( const float& a, const float& b );
constexpr float max( std::initializer_list<float> ilist );
您有两个主要选择:
投射到合适的类型:
auto f = static_cast<const float&(*)(const float&, const float&)>(std::max);
用lambda包裹它:
auto f = [](float a, float b) { return std::max(a, b); };
// Note there's no by-reference behaviour in this lambda.
将来,预计您将能够做得更好。特别是,反射应该允许lift
实用程序使用像auto f = lift(reflexpr(std::max));
之类的东西。你今天可以用宏来模仿这样的事情(最简单的做法是将宏扩展为lambda)。我遇到过至少一个执行此操作的LIFT
宏。
答案 1 :(得分:2)
std::max有多个模板重载;您可以使用static_cast指定应使用哪一个。
static_cast
也可用于通过执行到特定类型的函数到指针转换来消除函数重载的歧义
e.g。
auto f = static_cast<const float& (*)(const float&, const float&)>(std::max<float>);