【发布时间】:2021-03-14 12:06:41
【问题描述】:
我正在尝试创建一个函数模板,它接受 std::max 和其他具有兼容原型的模板:
template <typename F>
int f(F g)
{
return g(1,2);
}
由于许多重载,模板参数 F 无法推断为 f.e.对于std::max,所以这将失败:
f(std::max);
一种可能性是用static_cast 提示:
f(static_cast<int const& (*)(int const&,int const&)>(std::max));
我正在寻找一种不那么冗长的方式,同时仍然能够轻松传递任何其他类型的匹配函数,例如 f.e.
f([](int i, int j) { return 3; });
f(std::function<int(int,int)>([](int i, int j) { return 4; }));
如果 C++11 和 C++14 有一个简单的方法,那就太好了,但如果只有一个 C++17 及以上版本,这也会有很大帮助。
【问题讨论】:
-
按原样传递 lambda?如
f([](int a, int b) { return std::max(a, b); })? -
stackoverflow.com/a/25875538/817643 如果您发现自己经常这样做。请注意,它不涉及
noexcept-ness。这需要在宏中进行更多重复。 -
抱歉吹毛求疵,但表现力是可取的。我想你的意思是冗长、啰嗦、笨拙
-
@largest_prime_is_463035818 无需抱歉;你完全正确。我编辑了那个。
标签: c++ template-argument-deduction function-templates