小田桐様
産総研 安藤です
ご指摘ありがとうございます。修正させていただきます。
基本的には、ConfigSampleの例で示しておりますように、
>>をオーバーロードすることが推奨されます。
#変換関数指定だと、テンプレートで生成されたコードに手を入れないと
#いけませんが、>>のオーバーロードは、変換関数の実装をincludeするだけで
#済みますので。
2008/12/08 11:33 Yasuaki Odagiri :
> 株式会社セック 小田桐と申します。
> お世話になっております。
>
> 産総研の安藤様とは先日のSI2008にてお話させていただきましたが、
> OpenRTM-aist-0.4.2のC++版に不具合がありましたので、
> ご報告いたします。
>
> 【現象】
> Configurationのパラメータにenum型や自作クラスの変数を
> 設定しようとするとコンパイルエラーが発生する
>
> 【原因】
> Configuraionではパラメータを文字列型(const char*)として扱っています。
> そのため、RTObject_impl::bindParameter()の4つ目の引数で、文字列から
> 設定対象の変数の型に変換する関数を与えることができるようになっています。
>
> RTObject.h -----
>
> template
> 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
> 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(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
>
> enum Level
> {
> High,
> Middle,
> Low
> };
>
> std::istream& operator>> (std::istream& is, Level& val);
>
> #endif LEVEL_H
> -------------------
>
> Level.cpp ---------
>
> #include
> #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;
> }
> -------------------
>
> 以上、よろしくお願いいたします。
>
>
>
株式会社セック 小田桐と申します。
お世話になっております。
産総研の安藤様とは先日のSI2008にてお話させていただきましたが、
OpenRTM-aist-0.4.2のC++版に不具合がありましたので、
ご報告いたします。
【現象】
Configurationのパラメータにenum型や自作クラスの変数を
設定しようとするとコンパイルエラーが発生する
【原因】
Configuraionではパラメータを文字列型(const char*)として扱っています。
そのため、RTObject_impl::bindParameter()の4つ目の引数で、文字列から
設定対象の変数の型に変換する関数を与えることができるようになっています。
RTObject.h -----
template
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
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(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
enum Level
{
High,
Middle,
Low
};
std::istream& operator>> (std::istream& is, Level& val);
#endif LEVEL_H
-------------------
Level.cpp ---------
#include
#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;
}
-------------------
以上、よろしくお願いいたします。