2014-10-17 68 views
1

有沒有辦法在C++中編寫一個可以將編譯時常量作爲參數的函數,但是如果您傳遞一個與運行時間相關的值,將會產生編譯錯誤?具體來說,我有一個構造函數,其中使用空指針進行初始化將具有可接受的行爲,但使用非空指針進行初始化意味着正在發生一些奇怪的事情。編寫一個只需要編譯時常量參數的函數?

詳細信息,如果它們很重要:類可以用智能指針構造,但不應該由(非空)原始指針構造。爲簡潔起見,我希望能夠從空指針直接初始化,但智能指針不允許來自原始指針的隱式轉換。這意味着在每個使用點需要額外的語言將空指針顯式包裝到智能指針中。通過將包裝移動到構造函數中去重複代碼會很好。

我知道這樣做的一種方法是使用運行時檢查傳遞的參數是否爲非空值,但我更希望在編譯時捕獲一般的原始指針轉換,如果可能的話,並且只有在原始指針肯定爲空時才允許編譯。

(請務必註明,如果你的技術依賴於C++ 11或C++ 14功能。)

+4

有一個默認的構造函數不會帶任何*指針並將其視爲一個空的智能指針會更容易嗎?即兩個構造函數,一個需要智能指針,另一個需要* nothing *?爲什麼把調用者的責任傳遞給NULL而不是簡單地傳遞任何東西。 – WhozCraig 2014-10-17 21:48:51

+0

您可能會考慮使用運行時檢查,限制它調試構建類型。如果你想堅持編譯時檢查,你也可以考慮'static_assert'。 – 2014-10-17 23:33:11

回答

0

由於C++ 11,你可以使用std::nullptr_t你想要的東西。

Demo

相關問題