2015-04-01 92 views
2

我們有幾個C++函數將在我們項目的階段2中實現,它們是公共接口或其各自的類和模塊的一部分。因爲它們是公共接口的一部分,所以我們認爲它們應該存在於第一階段的標題中,以便我們在實施其餘類時仍然在考慮它們。但是,由於它們未實現,我們不希望任何人給它們打電話。我們希望此檢查在編譯時發生,以確保正確性。C++編譯時未執行的檢查

我的願望是:

  • 編譯時間(可能是一個錯誤或警告;警告更好,因爲它們更靈活 - 我們可以選擇將它們關閉)

  • G上作品+ +4.8.1並且不會在Visual Studio 2013下終止構建(我們僅使用Visual Studio/VisualAssistX作爲編輯器,但重構工具在沒有構建的情況下無法運行)

  • 不太難理解所做的事爲什麼

  • 功能存在類文檔中(我們可以包括一些\warning not implemented in phase 1符號來doxygen的回暖)

我正在考慮三個選項:

  • 的腰帶和揹帶的做法marking them as deprecated(它會產生一個警告)並拋出一個自定義的異常 - 這幾乎是我想要的,除了編譯器警告它「被棄用」與真實情況相反:現在不推薦使用的方法,但不會以後;這種方法將工作後,但現在不工作

  • 另一個答案告訴how to forbid using a function while still having it exist - 這是很好,但難以閱讀,很難搜索。另外,這是一個編譯時錯誤 - 如果我們改變主意,我們不能讓一些函數調用它 - 它是全部或者全部。並且使每個未實現的函數都成爲一個模板,這讓我懷疑這個技巧是否會始終有效。例如,虛擬函數不能是模板。

  • 只是把它們作爲一個評論 - 從美其名曰保持人,但他們也不會自動生成的文檔中出現(我們不能決定以後有選擇性呼叫)

有沒有更好的方法?如果不是,是否有理由更喜歡模板或評論選項而不是棄用選項?

+0

['static_assert'](http://en.cppreference.com/w/cpp/language/static_assert)? – 2015-04-01 15:15:48

+0

@JoachimPileborg(與模板)是什麼在[禁止使用](http://stackoverflow.com/a/18814056/309334)答案我在上面提到。 [這個答案](http://stackoverflow.com/a/5246686/309334)說明了爲什麼模板是必要的。 – Eponymous 2015-04-01 15:20:31

回答

1

作爲替代方案:

你可以只聲明它們而不清晰,讓您得到鏈接錯誤。
然後,您可以提供一個帶有空定義的庫not_yet_implemented以允許過早使用這些功能。

馬克您刪除方法:= delete,最終被包裹在一個宏

#define NOT_YET_IMPLEMENTED = delete 
+0

通過包含'not_yet_implemented'庫,它可以有效地使函數在任何地方都可調用 - 刪除未實現的檢查。我可以想象想要這樣做的情況就像'int foo(){do_stuff_needed_in_all_phases(); if(condition_only_true_in_phase2){unimplemented_function(); }}'這將使我們不必在第二階段重新實現'foo()'。但是,我想'int bar(){unimplemented_function(); }'仍然失敗。 – Eponymous 2015-04-01 15:40:52

+0

由於上述原因,我更喜歡我的「棄用」解決方案。不過,這是唯一的答案,所以我會接受它。感謝您抽出時間來解決別人的問題,讓互聯網變得更美好。 – Eponymous 2015-04-02 19:50:18