template class を作成するときに、オブジェクトの型と、_ptr型、_var型がそれぞれ必要になる場合があります。
interface Hello { void hello_world(); };
といったインターフェースが定義されている場合、クライアント側では、Hello、Hello_ptr、Hello_var を使用することになりますが、_ptr、_var 型は単なる Hello のポインタではありませんので、これらを全て使うテンプレートクラスの宣言などは、
template <class Hello, class Hello_ptr, class Hello_var) class HelloHelper { : }
等のように書く必要があります。 しかし、実際には、omniORB などでは Hello クラス内で _ptr型、_var型をそれぞれ、_ptr_type、_var_type に typedef して利用しています。 omniORB で生成したスタブのコードの一部、
typedef _objref_hello* hello_ptr; // _ptr は objref_hello* への typedef typedef _CORBA_ObjRef_Var<_objref_hello, hello_Helper> hello_var; // _var型 class hello { public: // Declarations for this interface type. typedef hello_ptr _ptr_type; // hello_ptr は typename hello::_ptr_type typedef hello_var _var_type; // hello_var は typename hello::_var_type
このように定義されています。 従って、上記の template は以下のように書くことができます。
template<class ObjectType, class ObjectTypePtr = typename ObjectType::_ptr_type, class ObjectTypeVar = typename ObjectType::_var_type> class HogeHelper { : }
ただし、CORBA の仕様を見る限りでは _ptr_type や _var_type が標準として定められているわけではなさそうですので、この方法はポータブルな方法ではありません。 少なくとも omniORB4 でのみは確実に動作しそうですが、ほかの実装では、どのように定義されているかわかりません。 (定義が異なる場合は、template の第2引数、第3引数にそれぞれ_ptr型や、_var型を与えれば使えますが。。。)
上記のように、_ptr_type、_var_type が使えます。
TAO でも、同様の方法が使えます。 以下は、TAOのスタブの一部抜粋。
class Hello : public virtual CORBA::Object { public: friend class TAO::Narrow_Utils<Hello>; typedef Hello_ptr _ptr_type; typedef Hello_var _var_type;
MICO も同様に _ptr_type、_var_type が typedef されているので、同様の方法が使えます。 ただし、HAVE_TYPEDEF_OVERLOAD が define されている必要があるようですが、デフォルトでは _ptr_type、_var_type にアクセスできるようなので、問題ないようです。
class Hello : virtual public CORBA::Object { public: virtual ~Hello(); #ifdef HAVE_TYPEDEF_OVERLOAD typedef Hello_ptr _ptr_type; typedef Hello_var _var_type; #endif
手元に開発環境が無いため、google CodeSearch で探したところ、このようなコードがありましたので、状況は同じものと思われます。
class Codec : virtual public CORBA::Object { Codec(const Codec&); public: Codec() { } typedef Codec_ptr _ptr_type; typedef Codec_var _var_type;
google CodeSearch で、このようなコードを見つけました。 CosNaming の BindingIterator のスタブだと思われますが、_ptr_type、_var_type が定義されています。
class BindingIterator : public virtual CORBA::Object { public: typedef ::CosNaming::BindingIterator_ptr _ptr_type; typedef ::CosNaming::BindingIterator_var _var_type;
モーションエディタ/シミュレータ
動力学シミュレータ
統合開発プラットフォーム
産総研が提供するRTC集
東京オープンソースロボティクス協会
ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク
_ptr_type、_var_type について
template class を作成するときに、オブジェクトの型と、_ptr型、_var型がそれぞれ必要になる場合があります。
といったインターフェースが定義されている場合、クライアント側では、Hello、Hello_ptr、Hello_var を使用することになりますが、_ptr、_var 型は単なる Hello のポインタではありませんので、これらを全て使うテンプレートクラスの宣言などは、
等のように書く必要があります。 しかし、実際には、omniORB などでは Hello クラス内で _ptr型、_var型をそれぞれ、_ptr_type、_var_type に typedef して利用しています。 omniORB で生成したスタブのコードの一部、
このように定義されています。 従って、上記の template は以下のように書くことができます。
ただし、CORBA の仕様を見る限りでは _ptr_type や _var_type が標準として定められているわけではなさそうですので、この方法はポータブルな方法ではありません。 少なくとも omniORB4 でのみは確実に動作しそうですが、ほかの実装では、どのように定義されているかわかりません。 (定義が異なる場合は、template の第2引数、第3引数にそれぞれ_ptr型や、_var型を与えれば使えますが。。。)
他の ORB での定義の仕方
omniORB4
上記のように、_ptr_type、_var_type が使えます。
TAO
TAO でも、同様の方法が使えます。 以下は、TAOのスタブの一部抜粋。
MICO
MICO も同様に _ptr_type、_var_type が typedef されているので、同様の方法が使えます。 ただし、HAVE_TYPEDEF_OVERLOAD が define されている必要があるようですが、デフォルトでは _ptr_type、_var_type にアクセスできるようなので、問題ないようです。
ORBacus
手元に開発環境が無いため、google CodeSearch で探したところ、このようなコードがありましたので、状況は同じものと思われます。
ORBit2
google CodeSearch で、このようなコードを見つけました。 CosNaming の BindingIterator のスタブだと思われますが、_ptr_type、_var_type が定義されています。