_var_type, _ptr_type

_ptr_type、_var_type について

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型を与えれば使えますが。。。)

他の ORB での定義の仕方

omniORB4

上記のように、_ptr_type、_var_type が使えます。

TAO

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

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

ORBacus

手元に開発環境が無いため、google CodeSearch で探したところ、このようなコードがありましたので、状況は同じものと思われます。

 class Codec : virtual public CORBA::Object
 {
     Codec(const Codec&);
 public:
     Codec() { }
     typedef Codec_ptr _ptr_type;
     typedef Codec_var _var_type;

ORBit2

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;

ダウンロード

最新バージョン : 2.0.1-RELESE

統計

Webサイト統計
ユーザ数:2159
プロジェクト統計
RTコンポーネント307
RTミドルウエア35
ツール22
文書・仕様書2

Choreonoid

モーションエディタ/シミュレータ

OpenHRP3

動力学シミュレータ

OpenRTP

統合開発プラットフォーム

産総研RTC集

産総研が提供するRTC集

TORK

東京オープンソースロボティクス協会

DAQ-Middleware

ネットワーク分散環境でデータ収集用ソフトウェアを容易に構築するためのソフトウェア・フレームワーク