Информация об изменениях

Сообщение Re[2]: Как такое написать по Сиплюсплюсному? от 22.03.2025 20:03

Изменено 22.03.2025 20:04 rg45

Re[2]: Как такое написать по Сиплюсплюсному?
Здравствуйте, B0FEE664, Вы писали:

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


_>>Как такое написать по Сиплюсплюсному что бы без UB

BFE>
  Скрытый текст
_>>
_>>#include <stdio.h>

_>>template<class A,class B>A*parent_of(B*self,B A::*t) { 
_>>    return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}
_>>template<class A,class B>A*parent_of(B*self,B(A::*t)[1]) { 
_>>    return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}

_>>struct I1 { virtual void show()=0; };
_>>struct I2 { virtual void print()=0; };

_>>struct A {
_>>    int x[3];
_>>    struct :I1 {
_>>        A* parent() { return parent_of(this,&A::i1); }
_>>        void show() { printf("show x0=%d\n",parent()->x[0]); }
_>>    } i1[1];
_>>    struct :I2 {
_>>        A* parent() { return parent_of(this,&A::i2); }
_>>        void print() { printf("print x0=%d\n",parent()->x[0]); }
_>>    } i2[1];
_>>};

_>>void fn(I1* i) { i->show(); }
_>>void fn(I2* i) { i->print(); }

_>>int main(int argc, char **argv) {
_>>    A a[1];
    a->>>x[0]=123;
_>>    fn(a->i1);
_>>    fn(a->i2);
_>>    return 0;
_>>}
_>>




BFE>
BFE>#include <stdio.h>

BFE>struct I1 
BFE>{ 
BFE>    virtual void show()=0; 
BFE>};
BFE>struct I2 
BFE>{ 
BFE>    virtual void print()=0; 
BFE>};

BFE>struct A : I1,I2
BFE>{
BFE>    int x[3];
BFE>    void show() { printf("show x0=%d\n",x[0]); }
BFE>    void print() { printf("print x0=%d\n",x[0]); }
BFE>    I1*  i1 = { this };
BFE>    I2*  i2 = { this };
BFE>};

BFE>void fn(I1* i) { i->show(); }
BFE>void fn(I2* i) { i->print(); }

BFE>int main(int argc, char **argv) {
BFE>    A a[1];
    a->>x[0]=123;
BFE>    fn(a->i1);
BFE>    fn(a->i2);
BFE>    return 0;
BFE>}
BFE>

BFE>

А потом так хоба:

    A b = a[0];
    b.x[0] = 456;
    fn(b.i1); // show x0=123
    fn(b.i2); // print x0=123


Хлопотно это, автореференсные объекты. И некрасиво.
Re[2]: Как такое написать по Сиплюсплюсному?
Здравствуйте, B0FEE664, Вы писали:

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


_>>Как такое написать по Сиплюсплюсному что бы без UB

BFE>
  Скрытый текст
_>>
_>>#include <stdio.h>

_>>template<class A,class B>A*parent_of(B*self,B A::*t) { 
_>>    return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}
_>>template<class A,class B>A*parent_of(B*self,B(A::*t)[1]) { 
_>>    return (A*)((char*)self-(char*)(&(((A*)0)->*t)));
_>>}

_>>struct I1 { virtual void show()=0; };
_>>struct I2 { virtual void print()=0; };

_>>struct A {
_>>    int x[3];
_>>    struct :I1 {
_>>        A* parent() { return parent_of(this,&A::i1); }
_>>        void show() { printf("show x0=%d\n",parent()->x[0]); }
_>>    } i1[1];
_>>    struct :I2 {
_>>        A* parent() { return parent_of(this,&A::i2); }
_>>        void print() { printf("print x0=%d\n",parent()->x[0]); }
_>>    } i2[1];
_>>};

_>>void fn(I1* i) { i->show(); }
_>>void fn(I2* i) { i->print(); }

_>>int main(int argc, char **argv) {
_>>    A a[1];
    a->>>x[0]=123;
_>>    fn(a->i1);
_>>    fn(a->i2);
_>>    return 0;
_>>}
_>>




BFE>
BFE>#include <stdio.h>

BFE>struct I1 
BFE>{ 
BFE>    virtual void show()=0; 
BFE>};
BFE>struct I2 
BFE>{ 
BFE>    virtual void print()=0; 
BFE>};

BFE>struct A : I1,I2
BFE>{
BFE>    int x[3];
BFE>    void show() { printf("show x0=%d\n",x[0]); }
BFE>    void print() { printf("print x0=%d\n",x[0]); }
BFE>    I1*  i1 = { this };
BFE>    I2*  i2 = { this };
BFE>};

BFE>void fn(I1* i) { i->show(); }
BFE>void fn(I2* i) { i->print(); }

BFE>int main(int argc, char **argv) {
BFE>    A a[1];
    a->>x[0]=123;
BFE>    fn(a->i1);
BFE>    fn(a->i2);
BFE>    return 0;
BFE>}
BFE>

BFE>

А потом так хоба:

http://coliru.stacked-crooked.com/a/9771187b1c11b3b6

    A b = a[0];
    b.x[0] = 456;
    fn(b.i1); // show x0=123
    fn(b.i2); // print x0=123


Хлопотно это, автореференсные объекты. И некрасиво.