C++ reflection (P2996) and moc: Difference between revisions
No edit summary |
No edit summary |
||
Line 2: | Line 2: | ||
== Why? == | == Why? == | ||
moc extracts interesting metadata from QObject subclasses / | moc extracts interesting metadata from QObject subclasses / gadgets / namespaces. This metadata is then used at runtime to implement many different QMetaObject facilities. | ||
C++26 will (likely) ship with compile-time reflection. This means that the work that moc does today (as an external tool, with its custom lexer and parser etc.) could be done by the compiler itself. In the future, this may unlock lots of interesting possibilities (e.g. templated QObjects) and reduce technical debt (no need to maintain | C++26 will (likely) ship with compile-time reflection. This means that the work that moc does today (as an external tool, with its custom lexer and parser etc.) could be done by the compiler itself. In the future, this may unlock lots of interesting possibilities (e.g. templated QObjects) and reduce technical debt (no need to maintain our own C++ parser for moc). | ||
However, we're not sure how to get there just yet. Some questions that this work aims to answer: | However, we're not sure how to get there just yet. Some questions that this work aims to answer: | ||
Line 21: | Line 21: | ||
* P3491 "define_static_{string,object,array}" https://wg21.link/P3491 | * P3491 "define_static_{string,object,array}" https://wg21.link/P3491 | ||
== moc == | == Triggers for moc == | ||
moc needs to be run on source files that define classes or namespaces and in which a "trigger keyword" is found: Q_OBJECT, Q_GADGET, Q_NAMESPACE. |
Revision as of 19:24, 27 May 2025
This is a WORK IN PROGRESS page to understand the implications of "Reflection for C++" for the future of Qt and moc.
Why?
moc extracts interesting metadata from QObject subclasses / gadgets / namespaces. This metadata is then used at runtime to implement many different QMetaObject facilities.
C++26 will (likely) ship with compile-time reflection. This means that the work that moc does today (as an external tool, with its custom lexer and parser etc.) could be done by the compiler itself. In the future, this may unlock lots of interesting possibilities (e.g. templated QObjects) and reduce technical debt (no need to maintain our own C++ parser for moc).
However, we're not sure how to get there just yet. Some questions that this work aims to answer:
- Can we replace moc with a pure C++ solution?
- Is there something missing from standard C++ that we need for moc?
- How many source code (API) breaks are to be expected?
- If there's breakage, can porting tools automate the transition?
Reflection for Standard C++: references
Papers that are interesting for Qt:
- P2996 "Reflection for C++26" https://wg21.link/P2996
- P3394 "Annotations for Reflection" https://wg21.link/P3394
- P3096 "Function Parameter Reflection in Reflection for C++26" https://wg21.link/P3096
- P3491 "define_static_{string,object,array}" https://wg21.link/P3491
Triggers for moc
moc needs to be run on source files that define classes or namespaces and in which a "trigger keyword" is found: Q_OBJECT, Q_GADGET, Q_NAMESPACE.