2 неявных приведения типа в одном вызове. Как?
От: MTimur  
Дата: 27.12.16 20:31
Оценка:
Хочется странного. Есть переменная. Нужно заменить ее чем-то, что позволит автоматом проверять значение этой переменной после любой ее модификации.
Накостылил вот такой велосипед. Нужно, чтобы после оператора += выполнился метод check.
Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.
Как заставить компилятор выполнить 2 приведения? Понимаю, что стандарт запрещает, но может быть есть какая-то хитрость?
Re: 2 неявных приведения типа в одном вызове. Как?
От: Chorkov Россия  
Дата: 27.12.16 21:16
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Хочется странного. Есть переменная. Нужно заменить ее чем-то, что позволит автоматом проверять значение этой переменной после любой ее модификации.

MT>Накостылил вот такой велосипед. Нужно, чтобы после оператора += выполнился метод check.
MT>Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.
MT>Как заставить компилятор выполнить 2 приведения? Понимаю, что стандарт запрещает, но может быть есть какая-то хитрость?

Я бы так сделал (правда синтаксис вызовов изменится):

template<typename T>
class CAutoVar
{
    struct Holder {
        T value;
    } holder;
public:

    std::shared_ptr<Holder>
    operator -> ()
    {
        return std::shared_ptr<Holder>( &holder,
                                   [&](Holder*ptr){ check(); }
                                   );
    }

    void check()
    {
        std::cout<<"New value :"<<holder.value<<std::endl;
    }

};

void foo(int & value )
{
    value*=3;
}

int main()
{
    CAutoVar<int> n;

    n->value  = 10;
    n->value += 20;
    foo( n->value );

    return 0;
}
Re[2]: 2 неявных приведения типа в одном вызове. Как?
От: MTimur  
Дата: 27.12.16 21:30
Оценка:
Здравствуйте, Chorkov, Вы писали:

C>Здравствуйте, MTimur, Вы писали:


C>Я бы так сделал (правда синтаксис вызовов изменится):


В том-то и дело, что синтаксически работа с переменной не должна измениться. Есть, грубо говоря, 200 проектов среднего размера. Эти проекты насквозь пронизаны простой сущностью (int), которую внезапно понадобилось отслеживать на всем пути вычислений. Если изменить синтаксис, то только чтобы заставить "это" компилироваться понадобится неделя. На самом деле есть еще пара сущностей посложнее int'а, но с ними отдельная песня.
Re: 2 неявных приведения типа в одном вызове. Как?
От: _hum_ Беларусь  
Дата: 28.12.16 05:46
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Хочется странного. Есть переменная. Нужно заменить ее чем-то, что позволит автоматом проверять значение этой переменной после любой ее модификации.

MT>Накостылил вот такой велосипед. Нужно, чтобы после оператора += выполнился метод check.
MT>Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.
MT>Как заставить компилятор выполнить 2 приведения? Понимаю, что стандарт запрещает, но может быть есть какая-то хитрость?

я, может, чего не так понял, потому как напрашивается обычное:
class CInt
{
    int   m_i;
public:
   //----------
   CInt(const int i)
       : m_i(i)
   {}
   //----------
   CInt& operator+=(const int i)
   {
           m_i += i;
           check();
           return *this;
   }
   //----------
   operator int()
   {
      return m_i;       
   }
   //----------
private:
    //----------
    void check(){ std::cout<<"checked";}

};
 

int main()
{
    CInt n(0);
    printf("%d\n", n);    // 0
 
    n += 10;//checked
    printf("%d\n", n);    // 10
 
    return 0;
}
Re[2]: 2 неявных приведения типа в одном вызове. Как?
От: MTimur  
Дата: 28.12.16 06:03
Оценка:
Здравствуйте, _hum_, Вы писали:

MT>>без добавления в обертку всего зоопарка операторов.
Re: 2 неявных приведения типа в одном вызове. Как?
От: Кодт Россия  
Дата: 28.12.16 13:13
Оценка: 6 (2)
Здравствуйте, MTimur, Вы писали:

MT>Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.


Лень колбасить код, или другие причины?

Вариант раз
http://www.boost.org/doc/libs/1_63_0/libs/utility/operators.htm

Вариант два
class TheWrapper {
  TheVar var_;
public:
#define MODIFIER(r,data,OP) template<class Arg> TheWrapper& operator OP (Arg&& arg) { this->var_ OP arg; this->check(); return *this; }
#define MODIFIERS(...) BOOST_PP_SEQ_FOR_EACH(MODIFIER, _, BOOST_PP_VARIADIC_TO_SEQ(__VA_ARG__))
  MODIFIERS(=, +=, -=, *=, /=, .....)
  .....
};
Перекуём баги на фичи!
Re[2]: 2 неявных приведения типа в одном вызове. Как?
От: MTimur  
Дата: 30.12.16 15:56
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Здравствуйте, MTimur, Вы писали:

MT>>Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.
К>Лень колбасить код, или другие причины?

Лень, но уже наколбасил. Спасибо!
Re: 2 неявных приведения типа в одном вызове. Как?
От: Erop Россия  
Дата: 03.01.17 08:18
Оценка:
Здравствуйте, MTimur, Вы писали:

MT>Накостылил вот такой велосипед. Нужно, чтобы после оператора += выполнился метод check.

MT>Работает, но нужно обойтись без явного каста (в main()) без добавления в обертку всего зоопарка операторов.


Вот вел, который можно использовать в твоей задаче: http://rsdn.org/forum/cpp/2933445.1
Автор: Erop
Дата: 29.04.08
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.