【发布时间】:2020-06-10 13:24:28
【问题描述】:
我正在尝试用 C++ 编写“通用 beta 函数”(https://en.wikipedia.org/wiki/Beta_function#Multivariate_beta_function)。
这是我的工作:
template <typename... Args>
constexpr auto sum(Args&&... args) {
return (args + ...);
}
// Beta(a1, a2, ..., an) = Beta(a1, a2 + ... + an) * Beta(a2, ..., an)
template <std::floating_point F, typename... Ts>
constexpr F multivariate_beta(F a1, Ts... args) {
static_assert(sizeof...(args) > 0);
F value = std::beta(a1, sum(args...));
if constexpr (sizeof...(args) == 1)
return value;
else
return value * multivariate_beta(args...);
}
此函数适用于以下测试用例:
std::cout << multivariate_beta(1.0, 1.0, 1.0, 1.0) << '\n'; // should output 1 / 3!
std::cout << multivariate_beta(2.0, 3.0, 4.0) << '\n'; // should output 2! * 3! / 8!
但在以下测试用例中失败:
std::cout << multivariate_beta(1, 1, 1, 1) << '\n'; // compile error
std::cout << multivariate_beta(2, 3, 4) << '\n'; // compile error
编译器抱怨该函数只接受std::floating_point 概念类型的参数,
所以 (1, 1, 1, 1) 和 (2, 3, 4) 不是有效参数。
我对此不满意,因为 1, 1, 1, 1 和 2, 3, 4 可以隐式转换为浮点类型。
在这些情况下,如何强制将隐式转换为浮点数? 提前致谢。
【问题讨论】:
标签: c++17 variadic-templates c++20 c++-concepts