4

私は持っています

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名前をasdst::dst_bazおよびsrc::src_quxasに変更できる(マクロ以外の)同等のものはありdst::dst_quxますか?

私が間違っていない限り、usingステートメントも名前空間エイリアスも他の2つを達成することはできません。テンプレート化された転送関数を作成することdst_baz()は可能ですが、のアリティに関する知識が必要ですsrc_baz。テンプレートtypedefは可能性がありdst_qux<T>::typeますsrc_qux<T>が、間接参照により冗長性が追加されます。

FWIW、私のユースケースは、他の人々が簡潔にするために使用できるようsomepackage_someportion_somefuncAに、名前空間に適したバージョンのようなC名を使用して提供しています。somepackage::someportion::somefuncAusing somepackage::someportion

4

3 に答える 3

2

関数の場合、リクエストを手動で転送する必要があります。テンプレート以外のタイプの場合は、typedefを使用できます。テンプレートタイプの場合、yusingはc ++ 11の新機能を使用して、コンパイラがサポートしている場合、または基本的に運が悪い場合に、テンプレートのtypedefスタイルのエイリアスを作成できます。

于 2012-02-01T04:33:50.370 に答える
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便宜上sを作成してください。結局のところ、それが彼らの目的です。

于 2012-02-01T04:19:18.420 に答える
0

マクロの使用が許容できるオプションである場合は、次の1つの解決策があります。

// 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);
于 2012-02-01T04:24:43.020 に答える