我可以使用模板和刪除功能來防止調用具有字符或浮點變量的階乘,如下所示。如何爲具有負面參數的階乘編寫刪除函數?使用刪除來防止在C++中使用無效值調用14
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?
}
您不能,因爲值的計算是* runtime *。對於類型來說沒關係,因爲它們在編譯時是已知的,但是對於僅在運行時才知道的事物,您不能得到編譯器錯誤。我能看到的唯一解決方案是確保'T'是* unsigned *類型。 –
作爲另一種可能的解決方案,如果你只想允許無符號整數類型,只是* declare *通用函數,但不實現它(或者甚至可能將其標記爲已刪除?)。然後使用定義(實現)專門化無符號整數類型的函數。 –