Re[2]: Как такое написать по Сиплюсплюсному?
От: kov_serg Россия  
Дата: 22.03.25 20:07
Оценка:
Здравствуйте, B0FEE664, Вы писали:

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>
Так можно было просто указатели преобразовать. Не заводя отдельных полей.
I1* get_i1() { return this; }

Хочется чего-то более структурированного

Слегка усложним. А если так:
#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 I3 { virtual void next()=0; 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::i2o); }
        void print() { printf("print  x0=%d\n",parent()->x[0]); }
    } i2o[1];    
    struct :I2 {
        A* parent() { return parent_of(this,&A::i2); }
        void print() { printf("print2 x0=%d\n",parent()->x[0]); }
    } i2[1];
    struct :I3 {
        A* parent() { return parent_of(this,&A::i3); }
        void next() { printf("next3\n"); }
        void print() { printf("print3 x0=%d\n",200-parent()->x[0]); }
    } i3[1];
};

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

int main(int argc, char **argv) {
    A a[1];
    a->x[0]=123;
    fn(a->i1);
    fn(a->i2);
    fn(a->i2o);
    fn(a->i3);
    return 0;
}
Отредактировано 22.03.2025 20:14 kov_serg . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.