是否可以寫一個函數爲:明確的int類型作爲參數
void func(uint64_t val) {...}
在那裏,如果它被稱爲與任何其他整數類型比uint64_t
,而不需要修改我的#pragma
警告生成編譯時錯誤?
即:
uint32_t x = 0;
func(x) {...} // Error!
func(uint64_t(x)) {...} // Succes!
是否可以寫一個函數爲:明確的int類型作爲參數
void func(uint64_t val) {...}
在那裏,如果它被稱爲與任何其他整數類型比uint64_t
,而不需要修改我的#pragma
警告生成編譯時錯誤?
即:
uint32_t x = 0;
func(x) {...} // Error!
func(uint64_t(x)) {...} // Succes!
超載與函數模板的功能。除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;
標記它,謝謝。 –
@ViktorSehr你爲什麼要標記這個?這不是你想要的,正確的答案是美國人,這是一個重複的問題... – snb
我不記得確切的原因,因爲它是多年前,但作爲另一個說連接錯誤,我想我更喜歡編譯時間錯誤。 –
這會工作:
template< typename T >
void func(T param);
template<>
void func<uint64_t>(uint64_t param)
{
}
你會得到一個鏈接錯誤(足夠接近)。示例:http://ideone.com/5ft4F
哈哈,謝謝你,你通知我這個! :)讚賞!我看到,它沒有編譯,但我沒有看到這個錯誤,我一時沒有時間看到有什麼問題。 +1,這就是我的答案中缺少的。 –
+1。如果找不到更好的解決方案,我會將其標記爲正確 –
@KirilKirov我實際上試圖引導你朝正確的方向發展,但是你刪除了答案(否則不會添加一個答案)。 –
那麼,你想防止'func(1)'? –
這似乎是一個不尋常的要求;傳遞一個較小的整數類型不會導致精度或數據丟失,並且定義非常明確。爲了傳遞價值,它正在複製,所以沒有修改問題。你需要完全相同位寬的原因是什麼? – ssube
@peachykeen我有兩個ID處理緩存機制,而一個碰巧是32位和一個64位。在這種情況下,如果將32位id傳遞給64位參數,那麼得到編譯錯誤將會很方便。 (我知道我可以制定明確的類型。) –