2012-07-05 131 views
19

使用嵌套命名空間時,有時候完全限定名稱最終會變得很長。我知道我可以使用namespace abc = aaa::bbb::ccc來減少打字量(在某些情況下也可以提高可讀性)。用於在C++中重命名命名空間的一致方法

但是,我不確定在項目中的所有文件中實現這種重命名的最佳方式是什麼。直接的方法(即以每次使用的方式重命名長名稱空間)可能會導致最終在不同文件中爲同一完全限定名稱使用不同的短名稱。所以,我想要想出一個更一致的方式來做到這一點。

舉例來說,假設是這樣的:

project 
    |- client 
    | |- core 
    | |- plugin 
    | |- util 
    |- server 
     ... 

我想創建每個目錄一個頭,包括減少的名字。例如,project/client/core/core.h將包含namespace pr_cl_core = project::client::core(我知道這個短名稱的例子很差,但在真實的項目中他們更有意義)。然後,我會將core.h包含到project/client/core中的所有頭文件中,以便當包含該目錄中的標頭時,比如project/client/plugin/plugin_foo.h,短名稱空間版本即可用。

這是一個很好的方法嗎?還有其他更好的方法嗎?

我發現了幾個關於SO的C++命名空間的問題(例如,12),但它們都不涉及如何以項目範圍的方式解決名稱空間重命名問題。

編輯:此外,這樣的機制可以用來系統地重命名整個項目的長命名空間(如Boost的)。舉例來說,我通常會重命名一些名字空間,如:

namespace ip = boost::asio::ip; 
namespace ptime = boost::posix_time; 

目前,我這樣做是對每個翻譯單元的基礎上,但我想用整個項目的全局的方法來做到這一點。

+0

你可以這樣做,或者你可以讓它變得更簡單:在頂層有一個聲明所有命名空間和別名的原型的頭文件。然後將其包含在分區中。 – Linuxios 2012-07-05 15:55:35

+0

@Linuxios我也在想這樣的事情,但最終可能會引入很多依賴項:如果我更改了全局文件,幾乎項目中的所有文件都需要重新編譯。話雖如此,如果命名空間的結構沒有太多變化,它不應該是一個主要問題。 – betabandido 2012-07-05 15:59:05

+0

@betabendido:啊。那麼快速和骯髒的解決方案呢?預處理器宏!只需在每個文件中聲明它們的別名即可。這樣,每個文件都可以擁有自己的別名。是的,人們會爲重複的代碼大喊大叫,但是你總是可以添加一個編譯時間腳本來爲你做... – Linuxios 2012-07-05 16:01:38

回答

1

我會爭辯說,如果您反覆輸入長名稱空間名稱,那麼命名空間層次結構中就會出現錯誤。

假設你會有相同的類,反覆發現自己打字obj->sub()->subsub()->some_method()。這將違反Law of Demeter。對於類,您可以重構代碼(通過編寫包裝函數),以便層次結構中的類只需訪問上一層的方法。

命名空間也應該這樣做:如果你必須調用project::client::core那麼你應該在client中編寫包裝函數/類來暴露必要的接口到project。如果你需要在整個地方做到這一點,爲什麼不平坦你的名字空間結構,以便clientcore是在同一水平?

Boost使用嵌套名稱空間的事實僅部分屬實,因爲大多數嵌套命名空間(如auxdetail)不應被客戶端調用。例如。 Boost.MPL是一個非常好的例子,小心謹慎地不要無償暴露嵌套的命名空間。

+0

讓我們假設我決定扁平命名空間,所以我擺脫了這個問題。我將如何解決來自Boost的長名稱空間的問題?我想避免輸入'boost :: asio :: ip :: tcp :: socket'(或類似的東西)。 – betabandido 2012-07-06 11:58:20

+0

@betabandido Boost.Asio名稱空間命名確實太長。你至少可以嘗試使用別名來隔離其中的一些:'namespace asio = boost :: asio;'並且在使用TCP/IP套接字的低級代碼中,你可以執行'namespace socket = bost:asio :: ip :: tcp :: socket;'例如 – TemplateRex 2012-07-06 12:13:42

+0

這實際上是我現在正在做的。但我的問題是如何做到在一個項目中以系統的方式重命名所有源文件。至少有兩個潛在的優點可以用系統的方式做到這一點:1)減少鍵入量(特別是如果有多個重新插入)2)在整個項目中進行一致的重命名。 – betabandido 2012-07-06 12:22:02