[openrtm-users 00683] OpenRTMのC++版で自作クラスをConfiguraionに設定できない不具合

Yasuaki Odagiri odagiri @ sec.co.jp
2008年 12月 8日 (月) 11:33:29 JST


株式会社セック 小田桐と申します。
お世話になっております。

産総研の安藤様とは先日のSI2008にてお話させていただきましたが、
OpenRTM-aist-0.4.2のC++版に不具合がありましたので、
ご報告いたします。

【現象】
Configurationのパラメータにenum型や自作クラスの変数を
設定しようとするとコンパイルエラーが発生する

【原因】
Configuraionではパラメータを文字列型(const char*)として扱っています。
そのため、RTObject_impl::bindParameter()の4つ目の引数で、文字列から
設定対象の変数の型に変換する関数を与えることができるようになっています。

RTObject.h -----

template <typename VarType>
bool bindParameter(const char* param_name, VarType& var,
                   const char* def_val,
                   bool (*trans)(VarType&, const char*) = ::stringTo)
----------------

RTObject_impl::bindParameter()内では、ConfigAdmin::bindParameter()を
呼び出していますが、このConfigAdmin::bindParameter()内に問題があります。

ConfigAdmin.h -----

template <typename VarType>
bool bindParameter(const char* param_name, VarType& var,
                   const char* def_val,
                   bool (*trans)(VarType&, const char*) = ::stringTo)
{
  if (isExist(param_name)) return false;
  if (!::stringTo(var, def_val)) return false; // ★
  m_params.push_back(new Config<VarType>(param_name, var, def_val, trans));
  return true;
}
-------------------

上記の★で示した行のif文の条件式では、与えられた4つ目の引数transを
用いなければならないと思います。
StringUtil.hで定義されている::stringTo()は、演算子>>で
std::stringstream型から変換できる組み込み型などの一部の型でしか
使えません。
そのため、enum型や自作クラスではコンパイルエラーになります。
お手数ですが、修正をお願いできませんでしょうか?


なお、余談ですが、enum型や自作クラスでも演算子>>を
オーバーロードすればConfigurationに設定することができます。

例:Configuraionに設定可能なenum型Level

Level.h -----------

#ifndef LEVEL_H
#define LEVEL_H

#include <istream>

enum Level
{
    High,
    Middle,
    Low
};

std::istream& operator>> (std::istream& is, Level& val);

#endif LEVEL_H
-------------------

Level.cpp ---------

#include <string>
#include "Level.h"

std::istream& operator>> (std::istream& is, Level& val)
{
    std::string val_str;
    is >> val_str;
    
    if ( val_str == "High" )
    {
        val = High;
    }
    else if ( val_str == "Middle" )
    {
        val = Middle;
    }
    else if ( val_str == "Low" )
    {
        val = Low;
    }
    else
    {
        val = High;
    }
    
    return is;
}
-------------------

以上、よろしくお願いいたします。



-----------------------------------------------------------
 株式会社セック 開発本部 第一開発部
   〒150-0031 東京都渋谷区桜丘町 22-14 NESビル
   TEL: 03-5458-7741    FAX : 03-5458-7726
   URL: http://www.sec.co.jp

 小田桐 康暁 (Yasuaki ODAGIRI)
   E-Mail: odagiri @ sec.co.jp
-----------------------------------------------------------




openrtm-users メーリングリストの案内