Makro vs Szablon

Makro vs Szablon
0

Od czego zacząć aby stworzyć makro / szablon w stylu:

PROPERTY(Type type READ WRITE)

generalnie chciałbym aby to makro / szablon "pod maską" tworzyło obiekt klasy Type, dodawało go do prywatnej listy w klasie w której użyłbym tego makra a na podstawie tego czy występuje w nim READ / WRITE ustawiało w klasie "Type" flagi isReadable lub isWriteable do wartości true / false.

Za pomocą czego łatwiej to zrealizować? Wszelkie sugestie, linki mile widziane.

satirev
  • Rejestracja:prawie 14 lat
  • Ostatnio:około 4 lata
0

Napisz dokładnie co chcesz zrobić (wrzuć jakiś kod).

KR
  • Rejestracja:prawie 16 lat
  • Ostatnio:6 miesięcy
  • Postów:2514
0

z mojego doswiadczenia to uzyj dowolnej rzeczy ktora dziala bo jak zaczniesz sie nad kazdym detalem swojego kodu zastanawiac to nigdy projektu nie skonczysz. upiekszanie zostaw sobie na koniec albo jak bedzie za duzy zamet


░█░█░█░█░█░█░█░█░█░█░█░
edytowany 1x, ostatnio: krwq
0

Najprościej mówiąc szukam "zamiennika" dla makra Q_PROPERTY z Qt bo muszę przepisać kilka klas a te w Qt używają mnóstwo makr w stylu:

Kopiuj
Q_PROPERTY( Property name READ name WRITE setName) 

i później jest to łatwo dostępne poprzez QMetaObject:

Kopiuj
const QMetaObject* meta = this->metaObject();

int id = meta->indexOfProperty(nameOfProperty);
if(  id >= 0 ) {
QMetaProperty prop = meta->property(id);
}

Zdaje sobie sprawę że nie osiągnę identycznego zachowania w C++ bo tutaj w gre wchodzi moc ale szukam rozwiązania podobnego.

Potrzebuje mechanizm definiowania właściwości dla klasy ( które będą składowane pod postacią osobnej klasy np MetaObject w sekcji private ) które mogą być tylko do odczytu lub do odczytu i zapisu.

Dzięki temu gdy użytkownik będzie chciał ustawić jakąś właściwość dla klasy to kod mógłby wyglądać tak:

--- pseudokod ---

Kopiuj
bool setProperty(const QString &name, const QString &value);
{
    const MetaObject& meta = this->metaObject();
    int id = meta.indexOfProperty(name);

    if( id >= 0 ) {
        Property prop = meta.property(id);
        if( !prop.isWritable() ) {
            qWarning("Property is not writable!");
            return false;
        }
        
        prop.setValue(value);
        return true;
    }
}

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.