понедельник, 9 августа 2010 г.

Операторы преобразования

Сегодня после прочтения подраздела "Операторы преобразования" на стр. 48 книги Джеффа Элджера "Библиотека программиста. C++" пришел к тому, что тот велосипед, что я сконструировал для работы с параметрами можно упростить, вот его текущий код:


  class CParameter {
  public:
    CParameter() : m_Exist(false) { }
    CParameter(std::string & val, bool exist)
      : m_Exist(exist), m_Value(val) {};

    bool        Exist()   { return( m_Exist );                            }
    int         AsInt()   { return( atoi(str::Trim(m_Value).c_str()) );   }
    double      AsFloat() { return( atof(str::Trim(m_Value).c_str()) );   }
    std::string AsString(){ return( m_Value.c_str() );                    }

    bool        AsBool()  {
      std::string s(str::Trim(m_Value));
      if(s.empty())
        return(false);

      std::transform(s.begin(),s.end(),s.begin(),tolower);
      return(1 == strcmp( s.c_str(), "true"));
    }
  private:
    std::string m_Value;
    bool        m_Exist;
  };


его текущее использование выглядит таким:

std::string driver = m_Ini["driver"]["filepath"].AsString();

что является не совсем наглядным. После прочтения этого подраздела, пришел к выводу, что куда удобней будет перегрузить:
  • operator std::string()
  • opertator int() 
  • operator double()
  • operator bool()
Тогда работа с параметрами будет уже более наглядной:

 std::string driver ( m_Ini["driver"]["filepath"] );

т.е. компилятор зная тип, куда присваивается сам определяет нужную версию функции возврата и тем самым избавляет меня от необходимости писать эти громоздкие AsString() , AsInt() , etc

Комментариев нет: