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)
正如所看到这里,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)
您有两个主要选择:
强制转换为适当的类型:
auto f = static_cast<const float&(*)(const float&, const float&)>(std::max);
Run Code Online (Sandbox Code Playgroud)将其包装在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执行此操作的宏。
| 归档时间: |
|
| 查看次数: |
350 次 |
| 最近记录: |