我想寫一個函式,該函式接收一個任意型別的變數,并將其設定為int值,只有當給定變數的型別可以轉換為int。我的簡化代碼:
template <typename T>
void getInt(T& param)
{
int int_value = calculate_int_value() 。
if(std::is_convertible_v<int, T>){
param = static_cast<T>(int_value)。
}
}
然而,當我試圖編譯它時,我得到的錯誤如下
錯誤:對'std::__cxx11::basic_string<char>:basic_string(int&)'的呼叫沒有匹配的函式。錯誤:從'int'到'const char*'的轉換無效
這讓我覺得我不能只是在一個if陳述句里面轉換一個任意型別的int值,這證明了它的可轉換性。我怎樣才能實作我的目標呢?我錯過了什么嗎?
uj5u.com熱心網友回復:
std::is_convertible_v是在C 17中添加的,如果你的代碼使用它,那么這意味著你的編譯器支持C 17,它也有if constexpr:
if constexpr(std: :is_convertible_v<int, T>){
param = static_cast<T>(int_value)。
在一個常規的if中,即使它總是被評估為false,不管在if陳述句中的是什么,它仍然必須是有效的C 。即使一個常規的if陳述句的主體從未被執行過,它仍然必須被編譯為有效的C 。當某些東西被證明不能轉換為int時,試圖將其轉換為int,當然是行不通的。
if constexpr使之有可能做到這一點(只要if本身是一個編譯時常量運算式)。if陳述句的主體仍然必須是語法上有效的C ,但只是語法上有效。
轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/316144.html
標籤:
下一篇:從服務參考到客戶端共享型別/模型
