2012-02-01 19 views
3

私はsrcから「エイリアス」または「ラベル変更」の名前を「名前の変更」やしたいことを意味C++では、非名前空間、非クラス名の名前を変更/エイリアスできますか?

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

として参照したい

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

を持っています。

dst_barについては、もちろんnamespace dst { typedef src_bar dst_bar; }を使用することができます。 src::src_bazの名前をdst::dst_bazsrc::src_quxと変更することができます(マクロではない)同等品はdst::dst_quxとなりますか?

私が間違っていない限り、usingステートメントも名前空間エイリアスも他の2つを達成できません。 dst_baz()のテンプレート転送機能を書くことは可能ですが、src_bazのアリティについての知識が必要です。テンプレートのtypedefはdst_qux<T>::typesrc_qux<T>とすることができますが、間接指定は冗長性を追加します。

FWIW、私の使用例は、somepackage_someportion_somefuncAのようなCの名前をとり、他の人々が簡潔にするためにusing somepackage::someportionを採用できるように名前空間に対応したバージョンsomepackage::someportion::somefuncAを提供しています。

+0

'#define'は実行可能なオプションですか? – iammilind

答えて

2

手動で要求を転送する必要があります。テンプレート以外の型の場合はtypedefだけで済みます。テンプレートタイプの場合、yは新しいusingのC++の機能を使用できます11テンプレート用のtypedefスタイルのエイリアスを作成するには、コンパイラがサポートしているか、基本的には不運です。

+1

これは私が期待したものです。それを確認していただきありがとうございます。 –

0

いいえ、名前を変更して元の名前を使用しないようにすることはできません。

しかし、トリッキーで同じ効果を得ることができます。今、あなたはfoo::src::src_barや友人を持っている

namespace foo { 
    #include "src_stuff.h" 
} 

まず、あなたが名前空間のブロック内を囲いたい定義のヘッダをインポートします。

はその後、自由typedefを使用します。

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

出来上がりは、あなたがあったであろうsrc::src_barと同じであるbar::dst_barを持っています。さらに古い名前の下で利用可能な定義について気にしない場合は、最初の手順をスキップして、便宜のためにを作成してください。結局のところ、それが彼らのためだ。

+0

インクルードされたファイルをネームスペースに含めると、問題が発生する可能性があります。そのヘッダーの実装ファイルには名前空間がないため、インクルードされたヘッダーで宣言されたものとは異なる機能が定義されます。そして、これは質問の主要な部分、すなわち関数とテンプレートのtypedefのやり方をどうやって行うのかについては触れていません。 –

+0

@DavidRodríguez-dribeasテンプレートは実際には 'typedef'アプローチに干渉しません。あまりに長くなると、プリプロセッサマクロを使うことさえできます。 – Borealid

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

マクロベースのソリューションをありがとう。 –

関連する問題