_var_type, _ptr_type_en

_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 されているので、同様のほう方法が使える。

 class Hello : 
   virtual public CORBA::Object
 {
   public:
     virtual ~Hello();
     #ifdef HAVE_TYPEDEF_OVERLOAD
     typedef Hello_ptr _ptr_type;
     typedef Hello_var _var_type;
     #endif

ただし、HAVE_TYPEDEF_OVERLOAD が define されている必要があるようだが、デフォルトでは _ptr_type, _var_type にアクセスできるようなので、問題ないようだ。

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

 class BindingIterator : public virtual CORBA::Object
 {
 public:
   typedef ::CosNaming::BindingIterator_ptr _ptr_type;
   typedef ::CosNaming::BindingIterator_var _var_type;

このようなコードを見つけた。google CodeSearch で。 CosNaming の BindingIterator のスタブだと思われるが、_ptr_type, _var_type が 定義されている。

latest Releases

For Begginers

Windows msi(installer) package (only trying samples)

Development environment is required for RT-Component development. See download page for details.

Number of Projects

OpenHRP3

Dynamics simulator

OpenHRI

Human-Robot-Interaction RTCs

OpenRTP

Integrated Development Platform

OpenINVENT

Mobile Robot RTCs