2012-02-01 91 views
3

在C++中可以重命名/別名非命名空間,非類名?

namespace src { 
    struct src_bar; 
    void src_baz(); 
    template<class T> class src_qux; 
} 

我想引用作爲

namespace dst { 
    struct dst_bar; 
    void dst_baz(); 
    template<class T> class dst_qux; 
} 

意思是我想「重命名」或「別名」或src「重新標記」名其。對於dst_bar當然可以使用namespace dst { typedef src_bar dst_bar; }。是否有一些(非宏)等價物允許我將src::src_baz重命名爲dst::dst_bazsrc::src_qux作爲dst::dst_qux

除非我弄錯了,否則using聲明和命名空間別名都不能完成其他兩項。編寫dst_baz()的模板轉發功能是一種可能性,但需要知道src_baz的元數據。模板類型定義可能有dst_qux<T>::typesrc_qux<T>,但間接性增加了詳細程度。

FWIW,我的使用案例取名爲somepackage_someportion_somefuncA等C名稱,並提供了名稱友好的版本somepackage::someportion::somefuncA,以便其他人爲簡潔起見可以使用using somepackage::someportion

+0

是'#define'可行的選項嗎? – iammilind 2012-02-01 04:22:31

回答

2

對於你將不得不請求手動轉發功能。對於非模板類型,您可以只使用typedef。對於模板類型,y可以使用C++ 11的新功能using爲模板創建typedef樣式別名,如果您的編譯器支持它,或者您基本上運氣不好。

+1

這是我的預期。謝謝你確認。 – 2012-02-04 03:54:03

0

不,你不能「重命名」一些東西,以便它不再使用它的原名。

但是,您可以通過欺騙獲得相同的效果。

首先,導入標題爲要逮住命名空間塊裏面的定義:

namespace foo { 
    #include "src_stuff.h" 
} 

現在你有foo::src::src_bar和朋友。

然後,使用typedef寬鬆:

namespace bar { 
    typedef foo::src::src_bar dst_bar; 
} 

瞧,您已經有了一個bar::dst_bar這是一樣的src::src_bar本來。如果您不關心在舊名稱下可用的定義,請跳過第一步,併爲了方便起見而創建typedef。畢竟,這就是他們的目標。

+0

在命名空間中包含包含的文件勢必會造成問題...該頭文件的實現文件將不具有名稱空間,因此將定義與在所包含的頭文件中聲明的函數不同的函數。這並沒有解決問題的主要部分:如何做功能和模板的類型定義的等價物。 – 2012-02-01 04:31:02

+0

@DavidRodríguez-dribeas模板實際上並不干涉'typedef'方法。如果時間太長,甚至可以使用預處理器宏。 – Borealid 2012-02-01 04:34:36

0

如果宏的用途是你可以接受的選項,然後在這裏是一個解決方案:

// declare this macro in some common file 
#define CREATE(SCOPE) \ 
namespace SCOPE { \ 
    struct SCOPE## _bar; \ 
    void SCOPE## _baz(); \ 
    template<class T> class SCOPE## _qux; \ 
} 

用法:

CREATE(src); 
CREATE(dst); 
+0

感謝您使用基於宏的解決方案。 – 2012-02-04 03:53:45