2017-01-11 45 views
7

詮釋我有一個函數:不允許隱式轉換爲在函數調用

void foo(int n) { 
    std::cout << "foo(int)\n"; 
} 

,可以使用不同的參數調用,它可以是char,雙,浮法等:

foo(123); // 1 
foo('c'); // 2 
foo(0.2); // 3 
foo(0.2f); // 4 
// ... 

。 ..但我想只允許int參數(字面或變量),所以2,3,4,...以上將是非法的。我目前的解決辦法是刪除這些重載:

void foo(char) = delete; 
void foo(float) = delete; 
void foo(double) = delete; 

但重載這個名單可以很長,而且總有人可以寫一個類將隱式轉換爲int什麼都會允許使用我的int唯一功能所以我發現寫作(而不是長明確的清單):

template<typename T> 
void foo(T) = delete; 

按預期工作。

使用上面的模板有什麼缺點嗎?或者也許有更好的方法來解決這個問題?

+1

什麼_wrong_與非(真)'int'參數?如果這些值超出了你函數的範圍,你最好'拋出'異常。 – edmz

+1

@AlgirdasPreidžius唯一的區別是,這個問題基本上要求在這個問題中給出的答案潛在的缺點。 – BoBTFish

+0

即使這個問題寫得很好,它並沒有顯示任何研究嘗試,因爲搜索確切的標題,顯示了幾個關於同一問題的問題。 –

回答

2

您可以使用static_assertstd::is_same

template<typename T> 
void foo(T i) { 
    static_assert(std::is_same<T, int>::value, "Not int"); 
    std::cout << "foo(int)\n"; 
} 
相關問題