gpt4 book ai didi

c++ - 在 C++14 中使用 delete 防止调用无效值

转载 作者:行者123 更新时间:2023-11-30 01:06:43 25 4
gpt4 key购买 nike

我可以使用模板和删除工具来防止使用字符或浮点变量调用阶乘,如下所示。如何为带负参数的阶乘编写删除函数?

template <typename T>
constexpr T factorial(T n)
{
return (n == 1 || n == 0) ? 1 : (n * factorial(n - 1));
}

constexpr float factorial(double) = delete;
constexpr char factorial(char) = delete;

int main()
{
constexpr auto fiveFactorial = factorial(5);
constexpr auto point5fact = factorial(0.5); // Error. Call to deleted version
constexpr auto letter5fact = factorial('5'); // DITTO
constexpr auto minusFact = factorial(-1); // How to prevent this using delete?
}

最佳答案

不可能。 = delete 是编译时的事情,而您的参数在编译时并不总是已知。

您可以改用 unsigned 参数并删除所有那些已删除的重载,代价是无法使用带符号的数字调用您的函数,例如 factorial(2)

template <typename T> constexpr T factorial(T n)
{
static_assert(std::is_unsigned_v<T> && !std::is_same_v<T, char>,
"Parameter type must be integral, unsigned, and not `char`.");
return (n == 1 || n == 0) ? 1 : (n * factorial(T(n - 1)));
}

关于c++ - 在 C++14 中使用 delete 防止调用无效值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45995930/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com