【发布时间】:2021-11-08 16:44:49
【问题描述】:
考虑以下代码:
template<typename T, typename U>
constexpr auto divide(T rhs, U lhs) { return rhs / static_cast<T>(lhs); }
这里将默认值划分为 rhs 类型(这与我们从编译器获得的默认行为相同。
但是,如果我们想让除法更智能,这样它会在编译时推断出最好的返回类型(即不会导致任何参数变窄的类型)。
因此,divide(2, 3.0) 的结果是 0.6666...divide(2.0, 3) 也是如此,但 divide(2, 3) 的结果仍然是 0。
类似
template<typename T, typename U>
constexpr auto divide2(T rhs, U lhs) {
if constexpr (is_same<U, double>::value)
return static_cast<double>(rhs) / lhs;
else
return rhs / static_cast<T>(lhs);
}
但更通用 - 我可以查看每种可能的类型,但有更好的方法吗?
是否有一些巧妙地使用概念或元编程方法来确定哪个是更广泛的类型并选择它作为转换类型?类似max_type(T, U)?
【问题讨论】:
-
“这与我们从编译器获得的默认行为相同。” - 这是错误的。 en.cppreference.com/w/cpp/language/…
-
template<typename T, typename U> constexpr auto divide(T rhs, U lhs) { return rhs / lhs;}似乎在这里完成了工作。 :) -
@Jarod42 你是对的 :),我想简化我的问题,使其更具可读性,以至于它失去了意义......我正在使用类型包装器并返回一个类型包装器,在这种情况下我确实需要 common_type。
标签: c++ templates metaprogramming template-meta-programming