Re[7]: SRC: auto_pod<>
От: Блудов Павел Россия  
Дата: 10.02.03 04:12
Оценка: :)
Здравствуйте, Kaa, Вы писали:

Kaa>разыменование нулевого указателя не является легальным C++ (p->m => (*(p)).m (см. 5.2.5/3)).


Для эстетов:

#define _offsetof(type, field)    (((int)&((type*)0xDEADBEEF)->field) - (int)0xDEADBEEF)


Работает точно так же. Прочитал внимательно 5.2.5 Class member access [expr.ref].
Ни слова о нулевом указателе. Нельзя ли подробнее, что же я упустил?

Kaa>Ну, и про идентификаторы тоже... Все, что начинается с _<Большая латинская> — зарезервировано.


Вы про auto_pod::_PODSize? Он начинается с маленькой латинской буквы.
Указанное Вами правило (17.4.3.1.2) относится только к глобальным именам.
Или у нас стандарты разные

Павел.
Re[8]: SRC: auto_pod<>
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 10.02.03 09:38
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

Kaa>>разыменование нулевого указателя не является легальным C++ (p->m => (*(p)).m (см. 5.2.5/3)).


БП>Прочитал внимательно 5.2.5 Class member access [expr.ref].

БП>Ни слова о нулевом указателе. Нельзя ли подробнее, что же я упустил?
1.9/4, к примеру, говорит, что разыменование нулевого указателя порождает неопределенное поведение.

БП>Указанное Вами правило (17.4.3.1.2) относится только к глобальным именам.

Нет, стандарты у нас одинаковые. Тут я не прав. Спасибо.
Алексей Кирдин
Re: SRC: auto_value<>
От: vt_vitus  
Дата: 15.11.03 12:05
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Вот, достало ловить ошибки с неинициализованными членами больших классов, вида

... skip() ...
К>[/c]

А как можно модифицировать этот замечательный класс, что бы можно было писать нечто
    auto_value<int> i = 0;
    auto_value<int> j = i;

А то ругается на это, говорит : error C2440: 'initializing' : cannot convert from 'class auto_value<int,0>' to 'class auto_value<int,0>'
No copy constructor available for class 'auto_value<int,0>'

без этого в конструкторах копии приходится писать

CStructPath::CStructPath(const CStructPath& sp)/*:
startIndex(sp.startIndex)*/
{
    int i = sp.startIndex;
    startIndex = i;
//    finishIndex = sp.finishIndex;
//    bterminate = sp.bterminate;
//    bcreate = sp.bcreate;
}

ни одно из закомментаренных инициализаций не проходит ...
или я чего-то не так понял/сделал ?
Re[2]: SRC: auto_value<>
От: vt_vitus  
Дата: 15.11.03 12:42
Оценка:
не много облажался, как я понимаю надо так

CStructPath::CStructPath(const CStructPath& sp):
    startIndex(sp.startIndex.data())
{}


Но всё равно это не то ...
и ещё почему, на

auto_value<int> fI = 7;
int i = 5;
i = fI;

Вылетает ошибка — : error C2593: 'operator =' is ambiguous
Re[7]: SRC: auto_pod<>
От: MaximE Великобритания  
Дата: 15.11.03 14:04
Оценка:
Здравствуйте, Kaa, Вы писали:

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


К>>Супер!

Kaa>
Kaa>#define _offsetof(type, field)    ((int)&((type*)0)->field)
Kaa>


Kaa>Такой код может быть написан только в реализации стандартной библиотеки, или в компиляторно-зависимой библиотеке. Для всего остального разыменование нулевого указателя не является легальным C++ (p->m => (*(p)).m (см. 5.2.5/3)).


Он там и написан. <cstddef>:

#define offsetof(s,m)   (size_t)&(((s *)0)->m)


18.1.5
The macro offsetof accepts a restricted set of type arguments in this International Standard. type shall be a POD structure or a POD union (clause 9). The result of applying the offsetof macro to a field that is a static data member or a function member is undefined.

Re[8]: SRC: auto_pod<>
От: Kaa Украина http://blog.meta.ua/users/kaa/
Дата: 15.11.03 15:51
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Он там и написан. <cstddef>:

А еще — в коде Кодта Ключевое слово — "только". Так-что, все верно.
Алексей Кирдин
Re: SRC: auto_value<>
От: Рома Мик Россия http://romamik.com
Дата: 15.11.03 22:01
Оценка: -1
Здравствуйте, Кодт, Вы писали:

Сообщение старое, конечно. Но вот только что его прочитал. Кроме того янус еще не всю ветку у меня получил, так что, если что, не обижайтесь...

Я обычно с этой проблемой борюсь гораздо проще:
class Foo
{
    struct AllMyStaff
    {
        Bar bar;
        Foobar foobar;
        AllMyStaff() : bar( barParam ), foobar( foobarParam ) {}
    } allMyStaff;
};

Это, конечно, лишает массы удобств. Но и необходимо только для тяжелых классов, которые лучше сконструировать и не трогать.

А для легких, с конструктором по умолчанию, и которым присваивать можно:
class Foo
{
    Bar bar;
    Foobar foobar;
    struct AllMyStaff
    {
        AllMyStaff() 
        {
            bar = Bar(barParam);
            foobar = Foobar(foobarParam);
        }
    } allMyStaff;
};


Кроме того конструктор AllMyStaff ( хорошего названия я так и не придумал никогда, кто придумает скажите, а то уже надоели всякие X и прочие глупости ) можно сделать с параметром. Забыть его теперь нельзя, но можно передать нужные параметры.
... << RSDN@Home 1.1.0 stable >>
Re[2]: SRC: auto_value<>
От: Рома Мик Россия http://romamik.com
Дата: 15.11.03 22:15
Оценка:
Здравствуйте, Рома Мик, Вы писали:

Ну и уточнение. Совсем обычно я делаю так, как написано ниже, а написанное выше для случаев когда написанное ниже не годиться.
// .h
struct Foo
{
    //...
    static Foo * Make(FooParam);
};

//.cpp
namespace
{
    class FooInitializer
    {
        FooInitializer() {...};
    };
    class FooImpl : public Foo, private FooInitilizer
    {
    //...
    };
}
Foo * Foo::Make(FooParam)
{
    return new FooImpl(FooParam);
}
... << RSDN@Home 1.1.0 stable >>
Re[2]: SRC: auto_value<>
От: MaximE Великобритания  
Дата: 16.11.03 02:36
Оценка:
Здравствуйте, Рома Мик, Вы писали:

[]

РМ>А для легких, с конструктором по умолчанию, и которым присваивать можно:


РМ>
РМ>class Foo
РМ>{
РМ>    Bar bar;
РМ>    Foobar foobar;
РМ>    struct AllMyStaff
РМ>    {
РМ>        AllMyStaff() 
РМ>        {
РМ>            bar = Bar(barParam);
РМ>            foobar = Foobar(foobarParam);
        // a millon dollar question I did not have an answer to (© Max Payne 2)
        // чей bar и foobar?
РМ>        }
РМ>    } allMyStaff;
РМ>};
РМ>


Ты пробовал эту херню скомпилить хоть разок? Советую попробовать.
Re[3]: SRC: auto_value<>
От: Рома Мик Россия http://romamik.com
Дата: 16.11.03 12:45
Оценка:
Здравствуйте, MaximE, Вы писали:

ME>Здравствуйте, Рома Мик, Вы писали:


ME>[]


РМ>>А для легких, с конструктором по умолчанию, и которым присваивать можно:


РМ>>
РМ>>class Foo
РМ>>{
РМ>>    Bar bar;
РМ>>    Foobar foobar;
РМ>>    struct AllMyStaff
РМ>>    {
РМ>>        AllMyStaff() 
РМ>>        {
РМ>>            bar = Bar(barParam);
РМ>>            foobar = Foobar(foobarParam);
ME>        // a millon dollar question I did not have an answer to (© Max Payne 2)
ME>        // чей bar и foobar?
РМ>>        }
РМ>>    } allMyStaff;
РМ>>};
РМ>>


ME>Ты пробовал эту херню скомпилить хоть разок? Советую попробовать.

Пробовал, но достаточно давно. Потому забыл подробности. Это довольно редко нужный код, т.к. редко нельзя унаследоваться от AllMyStaff. В этом варианте надо передавать this в конструктор AllMyStaff.
... << RSDN@Home 1.1.0 stable >>
Re[3]: SRC: auto_value<>
От: Кодт Россия  
Дата: 16.11.03 13:03
Оценка:
Здравствуйте, vt_vitus, Вы писали:

<>

Хотя я и использую auto_value в проекте, но давно туда руки не запускал.
Возможно, что нужно явно определить конструктор копирования
template<class V> auto_value(const V& v) : t_(v) {}
template<T j> auto_value(const auto_value<T,j>& v) : t_(v.data()) {}

Насчет операторов вида T *** auto_value<T>
затрудняюсь сказать.

Но, кстати, в примере ты написал auto_value<int> fI = 7;
а смысл?
Ведь его задача — обеспечивать конструирование вида auto_value<int,7> fI;
Перекуём баги на фичи!
Re[8]: SRC: auto_pod<>
От: Аноним  
Дата: 21.11.03 17:14
Оценка:
Здравствуйте, Блудов Павел, Вы писали:

[]
БП>
БП>#define _offsetof(type, field)    (((int)&((type*)0xDEADBEEF)->field) - (int)0xDEADBEEF)
БП>

[]

А чем плохо стандартное макро offsetof?
Re[5]: SRC: auto_pod<>
От: McSeem2 США http://www.antigrain.com
Дата: 02.12.03 18:02
Оценка:
БП>
БП>struct aa
БП>{
БП>    __int64    i1;
БП>    __int8    i2;
БП>};

БП>16 == sizeof(aa);
БП>


БП>Хотя в этом случае, нилем имеет смысл прописать только первые 9-ть байт.

БП>Есть идеи?

Нет никаких идей. Это — суровая правда жизни
struct aa
{
    __int8    i2;
    __int64    i1;
};

Здесь размер — тоже 16 и надо инициализировать все 16 байт. Как отличить эти два случая? Можно, конечно, тупо и грязно использовать #pragma pack, но на Intel это приведет к резкой деградации производительности, а на других платформах (Sun, SGI, если там есть аналогичная прагма) — вообще не будет работать, там сразу "автобусная ошибка" и до свидания...
McSeem
Я жертва цепи несчастных случайностей. Как и все мы.
Re: SRC: auto_value<>
От: _nn_ www.nemerleweb.com
Дата: 03.12.03 10:29
Оценка:
Здравствуйте, Кодт, Вы писали:

Очень хорошая идея , но имеет небольшой недостаток — переменный инициализируются полько в начале , а что если я хочу сбросить все переменные в начальное состояние ?

Есть решение но с использованием макросов:
template<class T, T i = T()>
class auto_value
{
  T t_;
public:
  typedef T data_t;
  typedef auto_value& self_t;
  // конструктор по умолчанию - главное достоинство этой тулзы
  inline auto_value() : t_(i) {}

  // конструктор с 1 параметром (в том числе - конструктор копирования)
  template< class V >
  inline auto_value(V v) : t_(v) {}

  // доступ к данному
  inline const T& data() const { return t_; }
  inline T& data() { return t_; }

  // считается, что исходный тип - простой
  inline operator T  () const { return t_; }
  inline operator T& ()       { return t_; }

  // операторы присваивания
  template< class V > inline self_t operator =   (V v) { t_ =   v; return *this; }
  template< class V > inline self_t operator +=  (V v) { t_ +=  v; return *this; }
  template< class V > inline self_t operator -=  (V v) { t_ -=  v; return *this; }
  template< class V > inline self_t operator *=  (V v) { t_ *=  v; return *this; }
  template< class V > inline self_t operator /=  (V v) { t_ /=  v; return *this; }
  template< class V > inline self_t operator %=  (V v) { t_ %=  v; return *this; }
  template< class V > inline self_t operator &=  (V v) { t_ &=  v; return *this; }
  template< class V > inline self_t operator |=  (V v) { t_ |=  v; return *this; }
  template< class V > inline self_t operator ^=  (V v) { t_ ^=  v; return *this; }
  template< class V > inline self_t operator <<= (V v) { t_ <<= v; return *this; }
  template< class V > inline self_t operator >>= (V v) { t_ >>= v; return *this; }

  // по умалчанию
  inline void default_() { t_=i; }
};

#define BEGIN_AUTO_MAP() \
    public: \
    void default_() \
    {

#define AUTO_VALUE(v) \
    v.default_();

#define END_AUTO_MAP() \
    }

class Test
{
 auto_value<int,5> i;
 auto_value<char,'a'> c;

 BEGIN_AUTO_MAP()
  AUTO_VALUE(i)
  AUTO_VALUE(c)
 END_AUTO_MAP()
};


void main()
{
 Test test;
 
 test.i=10;
 test.c='f';
 
 test.default_();
}


Есть другие решения ?

С Уважением.
NN.
http://rsdn.nemerleweb.com
http://nemerleweb.com
Re: SRC: auto_value<>
От: MShura  
Дата: 09.01.04 22:48
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Вот, достало ловить ошибки с неинициализованными членами больших классов


Я для таких классов переопределяю оператор new, в котором обнуляю выделяемую память.
Все конструкторы переношу в private/protected и оставляю только статические функции типа CreateInstance с тем-же набором параметров, что и в конструкторах.
Re[2]: SRC: auto_value<>
От: Кодт Россия  
Дата: 10.01.04 20:07
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Я для таких классов переопределяю оператор new, в котором обнуляю выделяемую память.

MS>Все конструкторы переношу в private/protected и оставляю только статические функции типа CreateInstance с тем-же набором параметров, что и в конструкторах.

Во-первых, ты для каждого своего класса вынужден совершить ряд излишних телодвижений.
Во-вторых, не всегда это можно сделать — например, если я пишу кокласс с использованием ATL — там всегда используется единственный конструктор (без параметров) и к тому же класс заведомо не финальный: создается CComObject<MyClass> который является потомком.
Что же мне, ATL переписывать, чтобы там new память чистил?
Любая ситуация с наследованием от данного класса — и все, приплыли.
... << RSDN@Home 1.1.0 stable >>
Перекуём баги на фичи!
Re[3]: SRC: auto_value<>
От: MShura  
Дата: 11.01.04 19:41
Оценка:
Здравствуйте, Кодт, Вы писали:

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


MS>>Я для таких классов переопределяю оператор new, в котором обнуляю выделяемую память.

MS>>Все конструкторы переношу в private/protected и оставляю только статические функции типа CreateInstance с тем-же набором параметров, что и в конструкторах.

К>Во-первых, ты для каждого своего класса вынужден совершить ряд излишних телодвижений.

К>Во-вторых, не всегда это можно сделать — например, если я пишу кокласс с использованием ATL — там всегда используется единственный конструктор (без параметров) и к тому же класс заведомо не финальный: создается CComObject<MyClass> который является потомком.
К>Что же мне, ATL переписывать, чтобы там new память чистил?
К>Любая ситуация с наследованием от данного класса — и все, приплыли.

Насколько я помню, если оператор new есть у одного из базовых классов, то для производных он также будет вызываться (соответственно размер требуемой памяти будет передаваться нужный).
Re[3]: SRC: auto_value<>
От: MShura  
Дата: 11.01.04 19:47
Оценка: 15 (1)
Здравствуйте, Кодт, Вы писали:

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


MS>>Я для таких классов переопределяю оператор new, в котором обнуляю выделяемую память.

MS>>Все конструкторы переношу в private/protected и оставляю только статические функции типа CreateInstance с тем-же набором параметров, что и в конструкторах.

Это я делаю для классов, которыми могут пользоваться другие программисты. Таким образом я просто защищаюсь от создания экзампляра на стеке. Если наверняка известно, что данный класс ВСЕГДА будет создаваться с помощью оператора new (например в ATL/COM), то никаких лишиних телодвижений и не надо.
Забыл написать в прошлом посте, что у меня для этих целей есть простенький класс, у которого переопределены new + delete. Если мне нужна их функциональность, то я просто добавляю его в список базовых классов.
Re[4]: SRC: auto_value<>
От: Кодт Россия  
Дата: 11.01.04 21:22
Оценка:
Здравствуйте, MShura, Вы писали:

MS>Это я делаю для классов, которыми могут пользоваться другие программисты. Таким образом я просто защищаюсь от создания экзампляра на стеке. Если наверняка известно, что данный класс ВСЕГДА будет создаваться с помощью оператора new (например в ATL/COM), то никаких лишиних телодвижений и не надо.

MS>Забыл написать в прошлом посте, что у меня для этих целей есть простенький класс, у которого переопределены new + delete. Если мне нужна их функциональность, то я просто добавляю его в список базовых классов.

А если экземпляр — это член другого класса, тогда как быть? Тут не все так просто...
Кроме того, auto_value позволяет инициализировать переменные любым нужным значением
class Hello
{
    auto_value<bool,true> truth_;
    
    Hello() {}
    
    void goodbye() { truth_ = false; }
    
    bool came() const { return truth_; }
};
... << RSDN@Home 1.1.0 stable >>
Перекуём баги на фичи!
Re[5]: SRC: auto_value<>
От: MShura  
Дата: 12.01.04 08:34
Оценка:
Здравствуйте, Кодт, Вы писали:

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


MS>>Это я делаю для классов, которыми могут пользоваться другие программисты. Таким образом я просто защищаюсь от создания экзампляра на стеке. Если наверняка известно, что данный класс ВСЕГДА будет создаваться с помощью оператора new (например в ATL/COM), то никаких лишиних телодвижений и не надо.

MS>>Забыл написать в прошлом посте, что у меня для этих целей есть простенький класс, у которого переопределены new + delete. Если мне нужна их функциональность, то я просто добавляю его в список базовых классов.

К>А если экземпляр — это член другого класса, тогда как быть? Тут не все так просто...

А в чем проблема?Основное условие — все экземпляры/подэкземпляры должны создаваться через new.
Это так сказать цена за удобство.

К>Кроме того, auto_value позволяет инициализировать переменные любым нужным значением

Для таких целей тот подход бесполезен.
К>
К>class Hello
К>{
К>    auto_value<bool,true> truth_;
    
К>    Hello() {}
    
К>    void goodbye() { truth_ = false; }
    
К>    bool came() const { return truth_; }
К>};
К>
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.