_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 되고 있으므로, 같은 편방법을 사용할 수 있다.

 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 가 정의되고 있다.

ダウンロード

最新バージョン : 2.1.0-RELESE

統計

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

OpenRTM@Github

OpenRTM-aist GitHubサイト

ROS

Robot Operating System

Choreonoid

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

DAQ-Middleware

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

産総研が提供するRTC集

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