名前空間名の代入について – プログラミング – Home

名前空間名の代入について
 
通知
すべてクリア

[解決済] 名前空間名の代入について


アミバ
 アミバ
(@アミバ)
ゲスト
結合: 20年前
投稿: 36
Topic starter  

stlport4.6.2の_config.hを調べていたら、
namespace stlport = _STLP_STD;
という見慣れないコードを見つけました。
これは一体どういう事なんでしょうか?僕のC++の教科書にも載ってませんでした。
どうぞ宜しくお願いします!


引用未解決
トピックタグ
アミバ
 アミバ
(@アミバ)
ゲスト
結合: 20年前
投稿: 36
Topic starter  

すいません、補足させて下さい。

stlportについての質問ではなく、あくまで
「名前空間名に対する代入コードの意味(使い所など)」
を伺いたいです。

宜しくお願いします。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

namespace 用の typedef と思えばだいたい外してないかと。

例えば、namespace _STLP_STD 内の foo に、
stlport::foo でもアクセスできるようになります。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

使いどころは多分、長い名前空間に別名をつけたり、
規定の名前にあわせたりなのではないかと思いますが、
あまり有効な使い道は思いつかないかも...。

stlport の場合は、std 内の実装を差し替えるために
使ってたような。


返信引用
アミバ
 アミバ
(@アミバ)
ゲスト
結合: 20年前
投稿: 36
Topic starter  

Banさん、有難う御座いました。
見た目まんまの働きなんですね。が、やはり使い所がいまいち分かりませんねー。
拘るべきトコでもなさそうなんで、ここいらで解決とさせて頂きます。

感謝!です。


返信引用
Bosscat
 Bosscat
(@Bosscat)
ゲスト
結合: 23年前
投稿: 73
 

まさにtypedefや#defineと同じように使います。
ちょっとサンプルを書いて見ましたが、、
結局はclass Interfaceを再ビルド(差し替え)しないと実装の切り替えは不可能ですね。。。

あと、コンパイル時の展開タイミングもtemplateより早いので例えばこんなことをしても駄目
です。
template <class SPACE>
class Interface{
 :
namespace ns_implspace=SPACE
ImplBase * p = new ns_implspace::CImpl();
};
SPACE::CImple()に展開される・・・

---------------------------------
class ImplBase{
public:
 ImplBase(const char *name){
  strcpy(Name,name);
 }
 char Name[100];
};
---------------------------------
namespace IMPL_SPACE_1{
class CImpl:public ImplBase{
public:
 CImpl():ImplBase(impl1){}
};
}
---------------------------------
namespace IMPL_SPACE_2{
class CImpl:public ImplBase{
public:
 CImpl():ImplBase(impl2){}
};
}
---------------------------------
class Interface{
public:
 ImplBase* get(){
  namespace ns_implspace = IMPL_SPACE_2;
  ImplBase * p = new ns_implspace::CImpl();
 }
};
---------------------------------
int main(int argc,char *argv[]){
 Interface If;
 ImplBase *pImple = If.get();
 cout << pImple->Name << endl;
}
---------------------------------


返信引用
アミバ
 アミバ
(@アミバ)
ゲスト
結合: 20年前
投稿: 36
Topic starter  

Bosscatさん、どうも有難うございます。

名前空間の差し替えが主な用途のようですね。が、まだ効果的な使い方ってのがピンとき
ません。
差し替えが必要な場面に出くわした事がないからなのでしょう、きっと。

まだまだ経験不足。頑張るぞっと。


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

解決マークついてますが、切り替えとしては例えばこんなのとか?

namespace service_a { void foo(){} } // A方式
namespace service_b { void foo(){} } // B方式

#if defined(USE_A_SERVICE) // 結局マクロ切り替え....
namespace service = service_a;
#else
namespace service = service_b;
#endif

service::foo();

本来的な用途は、あくまでエイリアスの方だと思いますが。
以下、「The C++ Programming Language(Bjarne Stroustrup)」より引用。

If users give their namespace short names,
the names of different namespaces will clash.
However, long namespace can be impractical in
real code.
The dilemma can be resolved by providing a
short alias for a longer namespace name.

// つまり、 ライブラリなどのヘッダでは衝突を避けておいて、
namespace American_Telefhone_and_Telegraph {...}
// ユーザは衝突しない省略名をつけてアクセスしろ、と。
namespace ATL = American_Telefhone_and_Telegraph;


返信引用
Ban
 Ban
(@ban)
Prominent Member
結合: 5年前
投稿: 776
 

> namespace ATL = American_Telefhone_and_Telegraph;

失礼。
namespace ATT = American_Telefhone_and_Telegraph;
でした。


返信引用
たく
 たく
(@たく)
ゲスト
結合: 21年前
投稿: 29
 

たとえば、デバグとリリースで別のライブラリを使うときなど便利です。


返信引用

返信する

投稿者名

投稿者メールアドレス

タイトル *

プレビュー 0リビジョン 保存しました
共有:
タイトルとURLをコピーしました