stlport4.6.2の_config.hを調べていたら、
namespace stlport = _STLP_STD;
という見慣れないコードを見つけました。
これは一体どういう事なんでしょうか?僕のC++の教科書にも載ってませんでした。
どうぞ宜しくお願いします!
すいません、補足させて下さい。
stlportについての質問ではなく、あくまで
「名前空間名に対する代入コードの意味(使い所など)」
を伺いたいです。
宜しくお願いします。
namespace 用の typedef と思えばだいたい外してないかと。
例えば、namespace _STLP_STD 内の foo に、
stlport::foo でもアクセスできるようになります。
使いどころは多分、長い名前空間に別名をつけたり、
規定の名前にあわせたりなのではないかと思いますが、
あまり有効な使い道は思いつかないかも...。
stlport の場合は、std 内の実装を差し替えるために
使ってたような。
Banさん、有難う御座いました。
見た目まんまの働きなんですね。が、やはり使い所がいまいち分かりませんねー。
拘るべきトコでもなさそうなんで、ここいらで解決とさせて頂きます。
感謝!です。
まさに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;
}
---------------------------------
Bosscatさん、どうも有難うございます。
名前空間の差し替えが主な用途のようですね。が、まだ効果的な使い方ってのがピンとき
ません。
差し替えが必要な場面に出くわした事がないからなのでしょう、きっと。
まだまだ経験不足。頑張るぞっと。
解決マークついてますが、切り替えとしては例えばこんなのとか?
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;
> namespace ATL = American_Telefhone_and_Telegraph;
失礼。
namespace ATT = American_Telefhone_and_Telegraph;
でした。
たとえば、デバグとリリースで別のライブラリを使うときなど便利です。