[openrtm-users 00685] Re: OpenRTMのC++版で自作クラスをConfiguraionに設定できない不具合
Ando Noriaki
n-ando @ aist.go.jp
2008年 12月 10日 (水) 01:41:55 JST
小田桐様
産総研 安藤です
ご指摘ありがとうございます。修正させていただきます。
基本的には、ConfigSampleの例で示しておりますように、
>>をオーバーロードすることが推奨されます。
#変換関数指定だと、テンプレートで生成されたコードに手を入れないと
#いけませんが、>>のオーバーロードは、変換関数の実装をincludeするだけで
#済みますので。
2008/12/08 11:33 Yasuaki Odagiri <odagiri @ sec.co.jp>:
> 株式会社セック 小田桐と申します。
> お世話になっております。
>
> 産総研の安藤様とは先日の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
> -----------------------------------------------------------
>
>
>
--
安藤慶昭@独立行政法人産業技術総合研究所 研究員
知能システム研究部門 タスクインテリジェンス研究グループ
〒305-8568 茨城県つくば市梅園1-1-1 中央第2
TEL: 029-861-5981 FAX: 029-862-6631
n-ando @ aist.go.jp, n-ando @ ieee.org
openrtm-users メーリングリストの案内