2013-04-18 105 views
0

這是一個技術問題,以及(如果技術上可行)風格問題。在我的代碼中,我有一系列加載和操作文件的函數。對於不同的語法這些功能在單獨的名稱空間的存在,使得:C++:在程序邏輯/條件命名空間中使用名稱空間?

namespace typeA { 
    void load(); 
    void manipulate(); 
}; 

namespace typeB { 
    void load(); 
    void manipulate(); 
}; 

在該小例子,很明顯我可以簡單有用於檢查文件類型,然後調用的typeA一個子句:load()和類型B:負載()等。

但是,我想知道是否也可以使用命名空間別名來做到這一點?它會使代碼更清晰,因爲在命名空間中有幾十個對函數的調用,都需要單獨的if/else子句。

我已經試過什麼:

namespace my_type = (ft == "type_A") ? typeA : typeB; 
... 
my_type::load(); 

不與命名空間中的別名分配行錯誤編譯。

是否有另外一種方式來處理這種情況/通常採用的乾淨方式來處理這種情況?

我想每個文件類型的虛擬類和繼承將是一個選項。有其他人嗎?

+0

namespace聲明使用下一個字符串,它會如何工作? – Infested

+0

你也可以使用模板... – Nim

+0

@Nim:謝謝你的建議。如何在這種情況下使用模板?該函數的輸入將是相同的,只有通過字符串傳遞的文件的內容纔會不同。 – kmh

回答

2

沒有辦法做這樣的命名空間別名。

3.4.6 using指令和命名空間的別名[basic.lookup.udir] 1在使用指示符或命名空間的別名定義,查找爲一個命名空間名稱或用於 嵌套的名稱中名稱說明符只考慮名稱空間名稱。

您使用partial template specialization來解決這個問題。

+0

感謝您的指針。我想我現在想通過在我的所有函數中創建一個結構,然後自定義類型來指定我感興趣的實現,現在該怎麼做。這是否被認爲是很好的風格? – kmh

+0

@Martin不知道如果我正確理解你的目標和解決方案,通過我建議你檢查boost :: function和boost :: bind(在C++ 11中的std :: function和std :: bind)。 – alexrider

+0

@Martin一個可能的解決方案是通過創建traits結構。現在專門針對不同的標籤類型。有關示例,請參閱標準庫如何根據迭代器標記調度算法。請參閱[msdn]上的示例(http://msdn.microsoft.com/zh-cn/library/zdxb97eh(v = vs.71).aspx) –

相關問題