【发布时间】:2022-08-08 19:48:04
【问题描述】:
这有点丑。这是用 C++17 编写的最简单、最易读的方法,还是可以进一步清理?
template <typename T, std::enable_if_t<std::is_arithmetic_v<T>, bool> = true>
T increment(T v) {
...
}
我能想到的最好的方法是将其添加到包含文件中:
template <typename T>
using IsArithmetic = std::enable_if_t<std::is_arithmetic_v<T>, bool>;
然后像这样使用它:
template <typename T, IsArithmetic<T> = true>
T increment(T v) {
...
}
有更好的解决方案吗?
-
我推荐
std::nullptr_t = nullptr而不是bool = true,以通过手动传递参数来防止多个实例化的可能性。否则对我来说看起来不错,我认为没有宏就不能进一步缩短。 -
@Joseph - 你最好的简化基本上是 C++17 能做的最好的。甚至标准库实现也使用它或它的一个版本。鉴于它们是由知识最渊博的专家编写的,我认为我们不能做得更好。
-
在返回类型中使用 SFINAE 可能看起来更好:
template <typename T> std::enable_if_t<std::is_arithmetic_v<T>, T> increment(T v) {/*..*/} -
我想我已经看过
REQUIRESMACRO。不确定它是否在 C++17 中有所作为:/ -
@HolyBlackCat,在返回类型上使用
enable_if不是更好吗?这样你就永远无法覆盖它......
标签: c++ c++17 typetraits