[image]

Property средствами стандартного C++

 

Anton

втянувшийся

Есть тут кто-нибудь, кто пользуется банальным С++, а не экзотикой какой-нибудь вроде Форта? ;)

По историческим причинам использую Borland C++ Builder, но хотелось бы кое-что переделать в "стандартный" С++ (чтоб на Linux спокойно мигрировать, например :) ) В связи с этим встал вопрос - как сделать компактный и корректный аналог property? Понимаю, что через шаблоны :) Но вот никак не соображу, как с минимумом внешних конструкций сделать оператор присваивания
<variable>=<property>
вызывающий get-функцию?
   
+
-
edit
 

Balancer

администратор
★★★★★
А чем operator = не нравится?

Вообще, я на C++ программил много лет, но вот уже несколько лет на него забил. Как ещё за несколько лет до того забил на ассемблер :D

А спереносимостью - смотря что за приложение писать будешь. Даже GUI можно писать на C#. А уж консоль - десятки переносимых языков и, в первую очередь, всякая мощная функциональщина. Там такие вопросы и не встают :)
   

Vale

Сальсолёт
★☆
Что такое Kylix - ты, Anton, "ни сном ни духом"?

   

Anton

втянувшийся

Vale>Что такое Kylix - ты, Anton, "ни сном ни духом"?
Так цель - не просто миграция на Linux, а переход на стандартный код вообще.
Может завтра я его захочу на UNIX-платформе запускать ;)

   

Anton

втянувшийся

Balancer>А чем operator = не нравится?

Так если описывать такой operator = то он получается не внутри шаблона.
Внутри будет оператор
<property>=<value>
с вызовом set-функции
Хотелось бы как-то все сделать в одном флаконе, чтоб подключаюшь соответсвующий хедер property.hpp и описываешь свойство внутри класса
по типу

Class_property Property<type_of_property>

Ну и надо еще кстати как-то передать указатели на set- и get-функции в инкапсулирующем классе.

   
RU Филич #30.08.2004 14:17
+
-
edit
 

Филич

втянувшийся

это
__declspec( property( get=get_func_name, put=put_func_name ) ) declarator
такую конструкцию хочешь сделать?


   
+
-
edit
 

Balancer

администратор
★★★★★
Шаблоны, вообще, магко говоря, костыли изрядные :)
Что-то типа объктов в последних ассемблерах :)
   
+
-
edit
 

Anton

втянувшийся

Филич>это
Филич>__declspec( property( get=get_func_name, put=put_func_name ) ) declarator
Филич>такую конструкцию хочешь сделать?[»]

Ну, что-то в этом роде. И чтоб работало как нормальное property, при взятии значения или присваивании вызывало соответствующие функции. Кстати, кто-нибудь знает как оно у Борланда реализовано - на уровне компилятора или все-таки каким-нибудь преобразованием в нормальный код?
   
RU Vyacheslav #30.08.2004 14:51
+
-
edit
 

Vyacheslav

опытный

Подойдет?
Прикреплённые файлы:
 
   
RU Vyacheslav #30.08.2004 14:52  @Филич#30.08.2004 14:17
+
-
edit
 

Vyacheslav

опытный

Филич>>это
Филич>>__declspec( property( get=get_func_name, put=put_func_name ) ) declarator
Филич>>такую конструкцию хочешь сделать?[»]
Anton>Ну, что-то в этом роде. И чтоб работало как нормальное property, при взятии значения или присваивании вызывало соответствующие функции. Кстати, кто-нибудь знает как оно у Борланда реализовано - на уровне компилятора или все-таки каким-нибудь преобразованием в нормальный код?[»]
У Borland'a это реализовано на уровне компилятора

   
+
-
edit
 

Anton

втянувшийся

Vyacheslav>Подойдет?[»]

Точно пока сказать не могу, но по крайней мере мысли появились :)
Спасибо!
   
RU Наивный #08.09.2004 07:23
+
-
edit
 

Наивный

новичок
Комментарий от человека, который тоже часто пользует Builder, а так же живёт с другими компиляторами:
Есть код, который автоматом генерирует среда, когда на формы контролы бросаешь. Ничего не поделать - он спецефичен для борланда. Есть остальной код, и ему совершенно не интересно знать про борландовские проперти. Непонятно, откуда тут проблема, т.к. борландовскую часть всё равно переделывать придется при портировании.
У меня лично скорее даже не проблемы, а раздражение вызывает что у не-gnu-тых компиляторов любят в библиотеках использовать доморощеные типы. И между двумя вышеописанными типами кода вечно остается код преобразования шила в мыло...для того, чтобы основная часть кода была портабельной...
   

Anton

втянувшийся

Так я "графическую" часть переделывать не собираюсь, мне надо переделать "расчетную" часть, которая тоже на объектах и тоже с использованием property, только объекты уже мои, а не борландовские
   

Kos

новичок
Дарю :)

code text
  1. #include <iostream>
  2.  
  3. template<class _T, class Controller>
  4. class Property{
  5.         typedef _T (Controller::*Getter)() const;
  6.         typedef _T (Controller::*Setter)(const _T &);
  7.  
  8.         Controller &m_cntlr;
  9.         const Getter m_getter;
  10.         const Setter m_setter;
  11. public:
  12.         Property(Controller &cntlr, Getter getter, Setter setter) throw():
  13.         m_cntlr(cntlr), m_getter(getter), m_setter(setter){
  14.         }
  15.         operator _T () const{
  16.                 return (m_cntlr.*m_getter)();
  17.         }
  18.         const _T operator =(const _T &value){
  19.                 return (m_cntlr.*m_setter)(value);
  20.         }
  21. };
  22.  
  23. template<class _T, class Controller>
  24. std::ostream & operator <<(std::ostream &stream, const Property<_T, Controller> &value) throw(){
  25.         stream << static_cast<_T>(value);
  26.         return stream;
  27. }
  28.  
  29. class Object{
  30.         int m_value;
  31.         int PropGet() const{
  32.                 std::cout<<"[Getter]";
  33.                 return m_value;
  34.         }
  35.         int PropSet(const int &value){
  36.                 std::cout<<"[Setter]";
  37.                 return m_value=value;
  38.         }
  39. public:
  40.         Property<int, Object> m_property;
  41.         Object():m_property(*this, &Object::PropGet, &Object::PropSet){}
  42. };
  43.  
  44. int main(int argc, char* argv[]){
  45.         Object obj;
  46.         obj.m_property=1;
  47.         std::cout<<"property = "<<obj.m_property<<std::endl;
  48. }
   

Anton

втянувшийся

Спасибо!
Примерно так я себе и представлял псоле того, как прочитал то на что Vyacheslav указал
   

в начало страницы | новое
 
Поиск
Настройки
Твиттер сайта
Статистика
Рейтинг@Mail.ru