2012-10-18 86 views
3

是否可以寫一個函數爲:明確的int類型作爲參數

void func(uint64_t val) {...} 

在那裏,如果它被稱爲與任何其他整數類型比uint64_t,而不需要修改我的#pragma警告生成編譯時錯誤?

即:

uint32_t x = 0; 
func(x) {...} // Error! 
func(uint64_t(x)) {...} // Succes! 
+0

那麼,你想防止'func(1)'? –

+0

這似乎是一個不尋常的要求;傳遞一個較小的整數類型不會導致精度或數據丟失,並且定義非常明確。爲了傳遞價值,它正在複製,所以沒有修改問題。你需要完全相同位寬的原因是什麼? – ssube

+0

@peachykeen我有兩個ID處理緩存機制,而一個碰巧是32位和一個64位。在這種情況下,如果將32位id傳遞給64位參數,那麼得到編譯錯誤將會很方便。 (我知道我可以制定明確的類型。) –

回答

5

超載與函數模板的功能。除uint64_t之外,函數模板將更適合所有參數類型。您可以定義函數模板,以便在使用時創建錯誤。

void func(uint64_t val) { ... } 

template <typename T> 
void func(T) 
{ 
    static_assert(false, "argument type is not uint64_t"); 
} 

用C++ 11可以使用下面的模板:

template <typename T> 
void func(T&&) = delete; 
+0

標記它,謝謝。 –

+0

@ViktorSehr你爲什麼要標記這個?這不是你想要的,正確的答案是美國人,這是一個重複的問題... – snb

+0

我不記得確切的原因,因爲它是多年前,但作爲另一個說連接錯誤,我想我更喜歡編譯時間錯誤。 –

4

這會工作:

template< typename T > 
void func(T param); 

template<> 
void func<uint64_t>(uint64_t param) 
{ 
} 

你會得到一個鏈接錯誤(足夠接近)。示例:http://ideone.com/5ft4F

+0

哈哈,謝謝你,你通知我這個! :)讚賞!我看到,它沒有編譯,但我沒有看到這個錯誤,我一時沒有時間看到有什麼問題。 +1,這就是我的答案中缺少的。 –

+0

+1。如果找不到更好的解決方案,我會將其標記爲正確 –

+0

@KirilKirov我實際上試圖引導你朝正確的方向發展,但是你刪除了答案(否則不會添加一個答案)。 –

相關問題