*AI Summary*
The most appropriate group of people to review this topic would be *Senior Software Engineers specializing in C++ Language Standardization, Metaprogramming, and Compiler Architecture.*
**
### Abstract:
This presentation provides a detailed technical overview of the C++ static reflection feature adopted in the P2996 proposal for the C++26 standard, emphasizing its design, core components, and semantic implications. Static reflection exposes the program's structure at compile time via the compiler, contrasting with prior template metaprogramming attempts due to performance and implementation complexity concerns. Key language features introduced include the reflection operator (`<<...>>`, nicknamed "unibrow"), the splicing operator (`...`), and the unified meta-object type, `std::meta::info`. A critical design choice is the *stateful* nature of meta-objects, meaning they dynamically update based on the compilation context (e.g., completion of an incomplete type). The talk reviews meta-functions, covering challenges like achieving consistent parameter names across function declarations and definitions, and introduces `constexpr` exceptions as a mechanism for reporting reflection errors at compile time. The speaker advocates for reflection as a groundbreaking feature that will enable a new generation of standard and third-party C++ libraries.
### Summarization:
* *0:46 Introduction to Reflection:* The session focuses on C++ reflection, defined as the ability of software to expose its structure, noting that the C++26 proposal centers strictly on *static reflection* performed by the compiler at compile time.
* *2:24 The C++ Language Evolution Context:* The speaker, an ISO C++ Foundation and Boost Foundation board member, identifies the proposal as one of the largest ever, requiring incubation across both the Language (Core/Evolution) and Library Evolution (LEWG) working groups.
* *7:48 History and Design Divergence:* Early attempts at reflection (e.g., Matuš Cholchick's 2006 "Mirror" library and Boost HANA) relied on template metaprogramming, which was deemed too problematic due to excessive compile times, leading the committee to pursue dedicated language syntax.
* *11:27 Meta-Object Monotype Design:* The resulting design utilizes a monotype, `std::meta::info`, to represent all program elements (types, functions, templates, etc.) by value. This was chosen primarily because compiler implementers suggested that a hierarchical type system would be too heavy and complex to standardize and maintain.
* *18:10 Core Reflection Operators and Realm Shift:* The proposal introduces:
* The *Reflection Operator* (`<<...>>`, formerly a single caret), which *lifts* a program entity (like a type) into the reflection realm, resulting in a `std::meta::info` object.
* The *Splicing Operator* (`...`), which *extracts* or interpolates the C++ expression back from the `std::meta::info` object, allowing the creation of new types or variables based on the reflection result.
* *22:42 Constraint: `constexpr` Requirement:* Meta-type variables (those holding the result of a reflection operation) must be declared `constexpr` because the compiler must be able to hold and reason about them at compile time.
* *34:01 Stateful Reflection Semantics:* A non-trivial semantic detail is that reflection is *stateful.* A `std::meta::info` object representing an incomplete type will automatically reflect the type's completion later in the compilation unit, without needing a re-reflection operation. This behavior was adopted to avoid the implementation burden of snapshotting and storing meta-object states.
* *42:01 Meta-Function Details:* Meta-functions typically return a `std::meta::info` object, a vector of meta-info, a boolean, a size, or a string view. For instance, `identifier_of` returns the simple name in the closest scope, rather than a fully qualified name, a point relevant for logging applications.
* *42:58 Template Substitution/Instantiation:* The `substitute` meta-function serves as the reflection-realm equivalent of template instantiation, allowing programmatic construction of types (e.g., `std::array<int, 3>`) using reflected parameters. Instantiation only occurs when the meta-object is spliced back into the program context.
* *49:40 Param Naming Consistency Rule:* For the meta-function querying parameter names (`function_param_names`), the committee voted to enforce *consistent naming* between function declarations and definitions. If parameter names diverge, the code will fail to compile, imposing a new restriction on existing C++ codebases utilizing reflection-based libraries.
* *56:49 Comparison to AI and Rust:* The speaker maintains that reflection is necessary despite the rise of AI code generation tools, citing the lack of *consistent* output from AI agents. When comparing C++ reflection to Rust's procedural macros and `syn` library, the speaker views the C++ approach as offering a more intuitive user interface for observation than token stream manipulation.
* *59:30 `constexpr` Exceptions for Error Handling:* The proposal includes `constexpr` exceptions, allowing reflection logic to throw exceptions that are handled entirely at compile time (via `try-catch` within `constexpr` blocks). This provides users with better, more descriptive error messages compared to traditional compiler errors or standard template failure diagnostics.
* *1:01:04 Future Library Expectations:* The introduction of reflection is expected to significantly increase the number of library proposals submitted to the Library Evolution Working Group, as developers can now write powerful, cross-compiler utilities without modifying the language itself.
AI-generated summary created with gemini-2.5-flash-preview-09-2025 for free via RocketRecap-dot-com. (Input: 37,697 tokens, Output: 1,200 tokens, Est. cost: $0.0143).Below, I will provide input for an example video (comprising of title, description, and transcript, in this order) and the corresponding abstract and summary I expect. Afterward, I will provide a new transcript that I want a summarization in the same format.
**Please give an abstract of the transcript and then summarize the transcript in a self-contained bullet list format.** Include starting timestamps, important details and key takeaways.
Example Input:
Fluidigm Polaris Part 2- illuminator and camera
mikeselectricstuff
131K subscribers
Subscribed
369
Share
Download
Clip
Save
5,857 views Aug 26, 2024
Fluidigm Polaris part 1 : • Fluidigm Polaris (Part 1) - Biotech g...
Ebay listings: https://www.ebay.co.uk/usr/mikeselect...
Merch https://mikeselectricstuff.creator-sp...
Transcript
Follow along using the transcript.
Show transcript
mikeselectricstuff
131K subscribers
Videos
About
Support on Patreon
40 Comments
@robertwatsonbath
6 hours ago
Thanks Mike. Ooof! - with the level of bodgery going on around 15:48 I think shame would have made me do a board re spin, out of my own pocket if I had to.
1
Reply
@Muonium1
9 hours ago
The green LED looks different from the others and uses phosphor conversion because of the "green gap" problem where green InGaN emitters suffer efficiency droop at high currents. Phosphide based emitters don't start becoming efficient until around 600nm so also can't be used for high power green emitters. See the paper and plot by Matthias Auf der Maur in his 2015 paper on alloy fluctuations in InGaN as the cause of reduced external quantum efficiency at longer (green) wavelengths.
4
Reply
1 reply
@tafsirnahian669
10 hours ago (edited)
Can this be used as an astrophotography camera?
Reply
mikeselectricstuff
·
1 reply
@mikeselectricstuff
6 hours ago
Yes, but may need a shutter to avoid light during readout
Reply
@2010craggy
11 hours ago
Narrowband filters we use in Astronomy (Astrophotography) are sided- they work best passing light in one direction so I guess the arrows on the filter frames indicate which way round to install them in the filter wheel.
1
Reply
@vitukz
12 hours ago
A mate with Channel @extractions&ire could use it
2
Reply
@RobertGallop
19 hours ago
That LED module says it can go up to 28 amps!!! 21 amps for 100%. You should see what it does at 20 amps!
Reply
@Prophes0r
19 hours ago
I had an "Oh SHIT!" moment when I realized that the weird trapezoidal shape of that light guide was for keystone correction of the light source.
Very clever.
6
Reply
@OneBiOzZ
20 hours ago
given the cost of the CCD you think they could have run another PCB for it
9
Reply
@tekvax01
21 hours ago
$20 thousand dollars per minute of run time!
1
Reply
@tekvax01
22 hours ago
"We spared no expense!" John Hammond Jurassic Park.
*(that's why this thing costs the same as a 50-seat Greyhound Bus coach!)
Reply
@florianf4257
22 hours ago
The smearing on the image could be due to the fact that you don't use a shutter, so you see brighter stripes under bright areas of the image as you still iluminate these pixels while the sensor data ist shifted out towards the top. I experienced this effect back at university with a LN-Cooled CCD for Spectroscopy. The stripes disapeared as soon as you used the shutter instead of disabling it in the open position (but fokussing at 100ms integration time and continuous readout with a focal plane shutter isn't much fun).
12
Reply
mikeselectricstuff
·
1 reply
@mikeselectricstuff
12 hours ago
I didn't think of that, but makes sense
2
Reply
@douro20
22 hours ago (edited)
The red LED reminds me of one from Roithner Lasertechnik. I have a Symbol 2D scanner which uses two very bright LEDs from that company, one red and one red-orange. The red-orange is behind a lens which focuses it into an extremely narrow beam.
1
Reply
@RicoElectrico
23 hours ago
PFG is Pulse Flush Gate according to the datasheet.
Reply
@dcallan812
23 hours ago
Very interesting. 2x
Reply
@littleboot_
1 day ago
Cool interesting device
Reply
@dav1dbone
1 day ago
I've stripped large projectors, looks similar, wonder if some of those castings are a magnesium alloy?
Reply
@kevywevvy8833
1 day ago
ironic that some of those Phlatlight modules are used in some of the cheapest disco lights.
1
Reply
1 reply
@bill6255
1 day ago
Great vid - gets right into subject in title, its packed with information, wraps up quickly. Should get a YT award! imho
3
Reply
@JAKOB1977
1 day ago (edited)
The whole sensor module incl. a 5 grand 50mpix sensor for 49 £.. highest bid atm
Though also a limited CCD sensor, but for the right buyer its a steal at these relative low sums.
Architecture Full Frame CCD (Square Pixels)
Total Number of Pixels 8304 (H) × 6220 (V) = 51.6 Mp
Number of Effective Pixels 8208 (H) × 6164 (V) = 50.5 Mp
Number of Active Pixels 8176 (H) × 6132 (V) = 50.1 Mp
Pixel Size 6.0 m (H) × 6.0 m (V)
Active Image Size 49.1 mm (H) × 36.8 mm (V)
61.3 mm (Diagonal),
645 1.1x Optical Format
Aspect Ratio 4:3
Horizontal Outputs 4
Saturation Signal 40.3 ke−
Output Sensitivity 31 V/e−
Quantum Efficiency
KAF−50100−CAA
KAF−50100−AAA
KAF−50100−ABA (with Lens)
22%, 22%, 16% (Peak R, G, B)
25%
62%
Read Noise (f = 18 MHz) 12.5 e−
Dark Signal (T = 60°C) 42 pA/cm2
Dark Current Doubling Temperature 5.7°C
Dynamic Range (f = 18 MHz) 70.2 dB
Estimated Linear Dynamic Range
(f = 18 MHz)
69.3 dB
Charge Transfer Efficiency
Horizontal
Vertical
0.999995
0.999999
Blooming Protection
(4 ms Exposure Time)
800X Saturation Exposure
Maximum Date Rate 18 MHz
Package Ceramic PGA
Cover Glass MAR Coated, 2 Sides or
Clear Glass
Features
• TRUESENSE Transparent Gate Electrode
for High Sensitivity
• Ultra-High Resolution
• Board Dynamic Range
• Low Noise Architecture
• Large Active Imaging Area
Applications
• Digitization
• Mapping/Aerial
• Photography
• Scientific
Thx for the tear down Mike, always a joy
Reply
@martinalooksatthings
1 day ago
15:49 that is some great bodging on of caps, they really didn't want to respin that PCB huh
8
Reply
@RhythmGamer
1 day ago
Was depressed today and then a new mike video dropped and now I’m genuinely happy to get my tear down fix
1
Reply
@dine9093
1 day ago (edited)
Did you transfrom into Mr Blobby for a moment there?
2
Reply
@NickNorton
1 day ago
Thanks Mike. Your videos are always interesting.
5
Reply
@KeritechElectronics
1 day ago
Heavy optics indeed... Spare no expense, cost no object. Splendid build quality. The CCD is a thing of beauty!
1
Reply
@YSoreil
1 day ago
The pricing on that sensor is about right, I looked in to these many years ago when they were still in production since it's the only large sensor you could actually buy. Really cool to see one in the wild.
2
Reply
@snik2pl
1 day ago
That leds look like from led projector
Reply
@vincei4252
1 day ago
TDI = Time Domain Integration ?
1
Reply
@wolpumba4099
1 day ago (edited)
Maybe the camera should not be illuminated during readout.
From the datasheet of the sensor (Onsemi): saturation 40300 electrons, read noise 12.5 electrons per pixel @ 18MHz (quite bad). quantum efficiency 62% (if it has micro lenses), frame rate 1 Hz. lateral overflow drain to prevent blooming protects against 800x (factor increases linearly with exposure time) saturation exposure (32e6 electrons per pixel at 4ms exposure time), microlens has +/- 20 degree acceptance angle
i guess it would be good for astrophotography
4
Reply
@txm100
1 day ago (edited)
Babe wake up a new mikeselectricstuff has dropped!
9
Reply
@vincei4252
1 day ago
That looks like a finger-lakes filter wheel, however, for astronomy they'd never use such a large stepper.
1
Reply
@MRooodddvvv
1 day ago
yaaaaay ! more overcomplicated optical stuff !
4
Reply
1 reply
@NoPegs
1 day ago
He lives!
11
Reply
1 reply
Transcript
0:00
so I've stripped all the bits of the
0:01
optical system so basically we've got
0:03
the uh the camera
0:05
itself which is mounted on this uh very
0:09
complex
0:10
adjustment thing which obviously to set
0:13
you the various tilt and uh alignment
0:15
stuff then there's two of these massive
0:18
lenses I've taken one of these apart I
0:20
think there's something like about eight
0:22
or nine Optical elements in here these
0:25
don't seem to do a great deal in terms
0:26
of electr magnification they're obiously
0:28
just about getting the image to where it
0:29
uh where it needs to be just so that
0:33
goes like that then this Optical block I
0:36
originally thought this was made of some
0:37
s crazy heavy material but it's just
0:39
really the sum of all these Optical bits
0:41
are just ridiculously heavy those lenses
0:43
are about 4 kilos each and then there's
0:45
this very heavy very solid um piece that
0:47
goes in the middle and this is so this
0:49
is the filter wheel assembly with a
0:51
hilariously oversized steper
0:53
motor driving this wheel with these very
0:57
large narrow band filters so we've got
1:00
various different shades of uh
1:03
filters there five Al together that
1:06
one's actually just showing up a silver
1:07
that's actually a a red but fairly low
1:10
transmission orangey red blue green
1:15
there's an excess cover on this side so
1:16
the filters can be accessed and changed
1:19
without taking anything else apart even
1:21
this is like ridiculous it's like solid
1:23
aluminium this is just basically a cover
1:25
the actual wavelengths of these are um
1:27
488 525 570 630 and 700 NM not sure what
1:32
the suffix on that perhaps that's the uh
1:34
the width of the spectral line say these
1:37
are very narrow band filters most of
1:39
them are you very little light through
1:41
so it's still very tight narrow band to
1:43
match the um fluoresence of the dies
1:45
they're using in the biochemical process
1:48
and obviously to reject the light that's
1:49
being fired at it from that Illuminator
1:51
box and then there's a there's a second
1:53
one of these lenses then the actual sort
1:55
of samples below that so uh very serious
1:58
amount of very uh chunky heavy Optics
2:01
okay let's take a look at this light
2:02
source made by company Lumen Dynamics
2:04
who are now part of
2:06
excelitas self-contained unit power
2:08
connector USB and this which one of the
2:11
Cable Bundle said was a TTL interface
2:14
USB wasn't used in uh the fluid
2:17
application output here and I think this
2:19
is an input for um light feedback I
2:21
don't if it's regulated or just a measur
2:23
measurement facility and the uh fiber
2:27
assembly
2:29
Square Inlet there and then there's two
2:32
outputs which have uh lens assemblies
2:35
and this small one which goes back into
2:37
that small Port just Loops out of here
2:40
straight back in So on this side we've
2:42
got the electronics which look pretty
2:44
straightforward we've got a bit of power
2:45
supply stuff over here and we've got
2:48
separate drivers for each wavelength now
2:50
interesting this is clearly been very
2:52
specifically made for this application
2:54
you I was half expecting like say some
2:56
generic drivers that could be used for a
2:58
number of different things but actually
3:00
literally specified the exact wavelength
3:02
on the PCB there is provision here for
3:04
385 NM which isn't populated but this is
3:07
clearly been designed very specifically
3:09
so these four drivers look the same but
3:10
then there's two higher power ones for
3:12
575 and
3:14
520 a slightly bigger heat sink on this
3:16
575 section there a p 24 which is
3:20
providing USB interface USB isolator the
3:23
USB interface just presents as a comport
3:26
I did have a quick look but I didn't
3:27
actually get anything sensible um I did
3:29
dump the Pi code out and there's a few
3:31
you a few sort of commands that you
3:32
could see in text but I didn't actually
3:34
manage to get it working properly I
3:36
found some software for related version
3:38
but it didn't seem to want to talk to it
3:39
but um I say that wasn't used for the
3:41
original application it might be quite
3:42
interesting to get try and get the Run
3:44
hours count out of it and the TTL
3:46
interface looks fairly straightforward
3:48
we've got positions for six opto
3:50
isolators but only five five are
3:52
installed so that corresponds with the
3:54
unused thing so I think this hopefully
3:56
should be as simple as just providing a
3:57
ttrl signal for each color to uh enable
4:00
it a big heat sink here which is there I
4:03
think there's like a big S of metal
4:04
plate through the middle of this that
4:05
all the leads are mounted on the other
4:07
side so this is heat sinking it with a
4:09
air flow from a uh just a fan in here
4:13
obviously don't have the air flow
4:14
anywhere near the Optics so conduction
4:17
cool through to this plate that's then
4:18
uh air cooled got some pots which are
4:21
presumably power
4:22
adjustments okay let's take a look at
4:24
the other side which is uh much more
4:27
interesting see we've got some uh very
4:31
uh neatly Twisted cable assemblies there
4:35
a bunch of leads so we've got one here
4:37
475 up here 430 NM 630 575 and 520
4:44
filters and dcro mirrors a quick way to
4:48
see what's white is if we just shine
4:49
some white light through
4:51
here not sure how it is is to see on the
4:54
camera but shining white light we do
4:55
actually get a bit of red a bit of blue
4:57
some yellow here so the obstacle path
5:00
575 it goes sort of here bounces off
5:03
this mirror and goes out the 520 goes
5:07
sort of down here across here and up
5:09
there 630 goes basically straight
5:13
through
5:15
430 goes across there down there along
5:17
there and the 475 goes down here and
5:20
left this is the light sensing thing
5:22
think here there's just a um I think
5:24
there a photo diode or other sensor
5:26
haven't actually taken that off and
5:28
everything's fixed down to this chunk of
5:31
aluminium which acts as the heat
5:32
spreader that then conducts the heat to
5:33
the back side for the heat
5:35
sink and the actual lead packages all
5:38
look fairly similar except for this one
5:41
on the 575 which looks quite a bit more
5:44
substantial big spay
5:46
Terminals and the interface for this
5:48
turned out to be extremely simple it's
5:50
literally a 5V TTL level to enable each
5:54
color doesn't seem to be any tensity
5:56
control but there are some additional
5:58
pins on that connector that weren't used
5:59
in the through time thing so maybe
6:01
there's some extra lines that control
6:02
that I couldn't find any data on this uh
6:05
unit and the um their current product
6:07
range is quite significantly different
6:09
so we've got the uh blue these
6:13
might may well be saturating the camera
6:16
so they might look a bit weird so that's
6:17
the 430
6:18
blue the 575
6:24
yellow uh
6:26
475 light blue
6:29
the uh 520
6:31
green and the uh 630 red now one
6:36
interesting thing I noticed for the
6:39
575 it's actually it's actually using a
6:42
white lead and then filtering it rather
6:44
than using all the other ones are using
6:46
leads which are the fundamental colors
6:47
but uh this is actually doing white and
6:50
it's a combination of this filter and
6:52
the dichroic mirrors that are turning to
6:55
Yellow if we take the filter out and a
6:57
lot of the a lot of the um blue content
7:00
is going this way the red is going
7:02
straight through these two mirrors so
7:05
this is clearly not reflecting much of
7:08
that so we end up with the yellow coming
7:10
out of uh out of there which is a fairly
7:14
light yellow color which you don't
7:16
really see from high intensity leads so
7:19
that's clearly why they've used the
7:20
white to uh do this power consumption of
7:23
the white is pretty high so going up to
7:25
about 2 and 1 half amps on that color
7:27
whereas most of the other colors are
7:28
only drawing half an amp or so at 24
7:30
volts the uh the green is up to about
7:32
1.2 but say this thing is uh much
7:35
brighter and if you actually run all the
7:38
colors at the same time you get a fairly
7:41
reasonable um looking white coming out
7:43
of it and one thing you might just be
7:45
out to notice is there is some sort
7:46
color banding around here that's not
7:49
getting uh everything s completely
7:51
concentric and I think that's where this
7:53
fiber optic thing comes
7:58
in I'll
8:00
get a couple of Fairly accurately shaped
8:04
very sort of uniform color and looking
8:06
at What's um inside here we've basically
8:09
just got this Square Rod so this is
8:12
clearly yeah the lights just bouncing
8:13
off all the all the various sides to um
8:16
get a nice uniform illumination uh this
8:19
back bit looks like it's all potted so
8:21
nothing I really do to get in there I
8:24
think this is fiber so I have come
8:26
across um cables like this which are
8:27
liquid fill but just looking through the
8:30
end of this it's probably a bit hard to
8:31
see it does look like there fiber ends
8:34
going going on there and so there's this
8:36
feedback thing which is just obviously
8:39
compensating for the any light losses
8:41
through here to get an accurate
8:43
representation of uh the light that's
8:45
been launched out of these two
8:47
fibers and you see uh
8:49
these have got this sort of trapezium
8:54
shape light guides again it's like a
8:56
sort of acrylic or glass light guide
9:00
guess projected just to make the right
9:03
rectangular
9:04
shape and look at this Center assembly
9:07
um the light output doesn't uh change
9:10
whether you feed this in or not so it's
9:11
clear not doing any internal Clos Loop
9:14
control obviously there may well be some
9:16
facility for it to do that but it's not
9:17
being used in this
9:19
application and so this output just
9:21
produces a voltage on the uh outle
9:24
connector proportional to the amount of
9:26
light that's present so there's a little
9:28
diffuser in the back there
9:30
and then there's just some kind of uh
9:33
Optical sensor looks like a
9:35
chip looking at the lead it's a very
9:37
small package on the PCB with this lens
9:40
assembly over the top and these look
9:43
like they're actually on a copper
9:44
Metalized PCB for maximum thermal
9:47
performance and yeah it's a very small
9:49
package looks like it's a ceramic
9:51
package and there's a thermister there
9:53
for temperature monitoring this is the
9:56
475 blue one this is the 520 need to
9:59
Green which is uh rather different OB
10:02
it's a much bigger D with lots of bond
10:04
wise but also this looks like it's using
10:05
a phosphor if I shine a blue light at it
10:08
lights up green so this is actually a
10:10
phosphor conversion green lead which
10:12
I've I've come across before they want
10:15
that specific wavelength so they may be
10:17
easier to tune a phosphor than tune the
10:20
um semiconductor material to get the uh
10:23
right right wavelength from the lead
10:24
directly uh red 630 similar size to the
10:28
blue one or does seem to have a uh a
10:31
lens on top of it there is a sort of red
10:33
coloring to
10:35
the die but that doesn't appear to be
10:38
fluorescent as far as I can
10:39
tell and the white one again a little
10:41
bit different sort of much higher
10:43
current
10:46
connectors a makeer name on that
10:48
connector flot light not sure if that's
10:52
the connector or the lead
10:54
itself and obviously with the phosphor
10:56
and I'd imagine that phosphor may well
10:58
be tuned to get the maximum to the uh 5
11:01
cenm and actually this white one looks
11:04
like a St fairly standard product I just
11:06
found it in Mouse made by luminous
11:09
devices in fact actually I think all
11:11
these are based on various luminous
11:13
devices modules and they're you take
11:17
looks like they taking the nearest
11:18
wavelength and then just using these
11:19
filters to clean it up to get a precise
11:22
uh spectral line out of it so quite a
11:25
nice neat and um extreme
11:30
bright light source uh sure I've got any
11:33
particular use for it so I think this
11:35
might end up on
11:36
eBay but uh very pretty to look out and
11:40
without the uh risk of burning your eyes
11:43
out like you do with lasers so I thought
11:45
it would be interesting to try and
11:46
figure out the runtime of this things
11:48
like this we usually keep some sort
11:49
record of runtime cuz leads degrade over
11:51
time I couldn't get any software to work
11:52
through the USB face but then had a
11:54
thought probably going to be writing the
11:55
runtime periodically to the e s prom so
11:58
I just just scope up that and noticed it
12:00
was doing right every 5 minutes so I
12:02
just ran it for a while periodically
12:04
reading the E squ I just held the pick
12:05
in in reset and um put clip over to read
12:07
the square prom and found it was writing
12:10
one location per color every 5 minutes
12:12
so if one color was on it would write
12:14
that location every 5 minutes and just
12:16
increment it by one so after doing a few
12:18
tests with different colors of different
12:19
time periods it looked extremely
12:21
straightforward it's like a four bite
12:22
count for each color looking at the
12:24
original data that was in it all the
12:26
colors apart from Green were reading
12:28
zero and the green was reading four
12:30
indicating a total 20 minutes run time
12:32
ever if it was turned on run for a short
12:34
time then turned off that might not have
12:36
been counted but even so indicates this
12:37
thing wasn't used a great deal the whole
12:40
s process of doing a run can be several
12:42
hours but it'll only be doing probably
12:43
the Imaging at the end of that so you
12:46
wouldn't expect to be running for a long
12:47
time but say a single color for 20
12:50
minutes over its whole lifetime does
12:52
seem a little bit on the low side okay
12:55
let's look at the camera un fortunately
12:57
I managed to not record any sound when I
12:58
did this it's also a couple of months
13:00
ago so there's going to be a few details
13:02
that I've forgotten so I'm just going to
13:04
dub this over the original footage so um
13:07
take the lid off see this massive great
13:10
heat sink so this is a pel cool camera
13:12
we've got this blower fan producing a
13:14
fair amount of air flow through
13:16
it the connector here there's the ccds
13:19
mounted on the board on the
13:24
right this unplugs so we've got a bit of
13:27
power supply stuff on here
13:29
USB interface I think that's the Cyprus
13:32
microcontroller High speeded USB
13:34
interface there's a zyink spon fpga some
13:40
RAM and there's a couple of ATD
13:42
converters can't quite read what those
13:45
those are but anal
13:47
devices um little bit of bodgery around
13:51
here extra decoupling obviously they
13:53
have having some noise issues this is
13:55
around the ram chip quite a lot of extra
13:57
capacitors been added there
13:59
uh there's a couple of amplifiers prior
14:01
to the HD converter buffers or Andor
14:05
amplifiers taking the CCD
14:08
signal um bit more power spy stuff here
14:11
this is probably all to do with
14:12
generating the various CCD bias voltages
14:14
they uh need quite a lot of exotic
14:18
voltages next board down is just a
14:20
shield and an interconnect
14:24
boardly shielding the power supply stuff
14:26
from some the more sensitive an log
14:28
stuff
14:31
and this is the bottom board which is
14:32
just all power supply
14:34
stuff as you can see tons of capacitors
14:37
or Transformer in
14:42
there and this is the CCD which is a uh
14:47
very impressive thing this is a kf50 100
14:50
originally by true sense then codec
14:53
there ON
14:54
Semiconductor it's 50 megapixels uh the
14:58
only price I could find was this one
15:00
5,000 bucks and the architecture you can
15:03
see there actually two separate halves
15:04
which explains the Dual AZ converters
15:06
and two amplifiers it's literally split
15:08
down the middle and duplicated so it's
15:10
outputting two streams in parallel just
15:13
to keep the bandwidth sensible and it's
15:15
got this amazing um diffraction effects
15:18
it's got micro lenses over the pixel so
15:20
there's there's a bit more Optics going
15:22
on than on a normal
15:25
sensor few more bodges on the CCD board
15:28
including this wire which isn't really
15:29
tacked down very well which is a bit uh
15:32
bit of a mess quite a few bits around
15:34
this board where they've uh tacked
15:36
various bits on which is not super
15:38
impressive looks like CCD drivers on the
15:40
left with those 3 ohm um damping
15:43
resistors on the
15:47
output get a few more little bodges
15:50
around here some of
15:52
the and there's this separator the
15:54
silica gel to keep the moisture down but
15:56
there's this separator that actually
15:58
appears to be cut from piece of
15:59
antistatic
16:04
bag and this sort of thermal block on
16:06
top of this stack of three pel Cola
16:12
modules so as with any Stacks they get
16:16
um larger as they go back towards the
16:18
heat sink because each P's got to not
16:20
only take the heat from the previous but
16:21
also the waste heat which is quite
16:27
significant you see a little temperature
16:29
sensor here that copper block which
16:32
makes contact with the back of the
16:37
CCD and this's the back of the
16:40
pelas this then contacts the heat sink
16:44
on the uh rear there a few thermal pads
16:46
as well for some of the other power
16:47
components on this
16:51
PCB okay I've connected this uh camera
16:54
up I found some drivers on the disc that
16:56
seem to work under Windows 7 couldn't
16:58
get to install under Windows 11 though
17:01
um in the absence of any sort of lens or
17:03
being bothered to the proper amount I've
17:04
just put some f over it and put a little
17:06
pin in there to make a pinhole lens and
17:08
software gives a few options I'm not
17:11
entirely sure what all these are there's
17:12
obviously a clock frequency 22 MHz low
17:15
gain and with PFG no idea what that is
17:19
something something game programmable
17:20
Something game perhaps ver exposure
17:23
types I think focus is just like a
17:25
continuous grab until you tell it to
17:27
stop not entirely sure all these options
17:30
are obviously exposure time uh triggers
17:33
there ex external hardware trigger inut
17:35
you just trigger using a um thing on
17:37
screen so the resolution is 8176 by
17:40
6132 and you can actually bin those
17:42
where you combine multiple pixels to get
17:46
increased gain at the expense of lower
17:48
resolution down this is a 10sec exposure
17:51
obviously of the pin hole it's very uh
17:53
intensitive so we just stand still now
17:56
downloading it there's the uh exposure
17:59
so when it's
18:01
um there's a little status thing down
18:03
here so that tells you the um exposure
18:07
[Applause]
18:09
time it's this is just it
18:15
downloading um it is quite I'm seeing
18:18
quite a lot like smearing I think that I
18:20
don't know whether that's just due to
18:21
pixels overloading or something else I
18:24
mean yeah it's not it's not um out of
18:26
the question that there's something not
18:27
totally right about this camera
18:28
certainly was bodge wise on there um I
18:31
don't I'd imagine a camera like this
18:32
it's got a fairly narrow range of
18:34
intensities that it's happy with I'm not
18:36
going to spend a great deal of time on
18:38
this if you're interested in this camera
18:40
maybe for astronomy or something and
18:42
happy to sort of take the risk of it may
18:44
not be uh perfect I'll um I think I'll
18:47
stick this on eBay along with the
18:48
Illuminator I'll put a link down in the
18:50
description to the listing take your
18:52
chances to grab a bargain so for example
18:54
here we see this vertical streaking so
18:56
I'm not sure how normal that is this is
18:58
on fairly bright scene looking out the
19:02
window if I cut the exposure time down
19:04
on that it's now 1 second
19:07
exposure again most of the image
19:09
disappears again this is looks like it's
19:11
possibly over still overloading here go
19:14
that go down to say say quarter a
19:16
second so again I think there might be
19:19
some Auto gain control going on here um
19:21
this is with the PFG option let's try
19:23
turning that off and see what
19:25
happens so I'm not sure this is actually
19:27
more streaking or which just it's
19:29
cranked up the gain all the dis display
19:31
gray scale to show what um you know the
19:33
range of things that it's captured
19:36
there's one of one of 12 things in the
19:38
software there's um you can see of you
19:40
can't seem to read out the temperature
19:42
of the pelta cooler but you can set the
19:44
temperature and if you said it's a
19:46
different temperature you see the power
19:48
consumption jump up running the cooler
19:50
to get the temperature you requested but
19:52
I can't see anything anywhere that tells
19:54
you whether the cool is at the at the
19:56
temperature other than the power
19:57
consumption going down and there's no
19:59
temperature read out
20:03
here and just some yeah this is just
20:05
sort of very basic software I'm sure
20:07
there's like an API for more
20:09
sophisticated
20:10
applications but so if you know anything
20:12
more about these cameras please um stick
20:14
in the
20:15
comments um incidentally when I was
20:18
editing I didn't notice there was a bent
20:19
pin on the um CCD but I did fix that
20:22
before doing these tests and also
20:24
reactivated the um silica gel desicant
20:26
cuz I noticed it was uh I was getting
20:28
bit of condensation on the window but um
20:31
yeah so a couple of uh interesting but
20:34
maybe not particularly uh useful pieces
20:37
of Kit except for someone that's got a
20:38
very specific use so um I'll stick a
20:42
I'll stick these on eBay put a link in
20:44
the description and say hopefully
20:45
someone could actually make some uh good
20:47
use of these things
Example Output:
**Abstract:**
This video presents Part 2 of a teardown focusing on the optical components of a Fluidigm Polaris biotechnology instrument, specifically the multi-wavelength illuminator and the high-resolution CCD camera.
The Lumen Dynamics illuminator unit is examined in detail, revealing its construction using multiple high-power LEDs (430nm, 475nm, 520nm, 575nm, 630nm) combined via dichroic mirrors and filters. A square fiber optic rod is used to homogenize the light. A notable finding is the use of a phosphor-converted white LED filtered to achieve the 575nm output. The unit features simple TTL activation for each color, conduction cooling, and internal homogenization optics. Analysis of its EEPROM suggests extremely low operational runtime.
The camera module teardown showcases a 50 Megapixel ON Semiconductor KAF-50100 CCD sensor with micro-lenses, cooled by a multi-stage Peltier stack. The control electronics include an FPGA and a USB interface. Significant post-manufacturing modifications ("bodges") are observed on the camera's circuit boards. Basic functional testing using vendor software and a pinhole lens confirms image capture but reveals prominent vertical streaking artifacts, the cause of which remains uncertain (potential overload, readout artifact, or fault).
**Exploring the Fluidigm Polaris: A Detailed Look at its High-End Optics and Camera System**
* **0:00 High-End Optics:** The system utilizes heavy, high-quality lenses and mirrors for precise imaging, weighing around 4 kilos each.
* **0:49 Narrow Band Filters:** A filter wheel with five narrow band filters (488, 525, 570, 630, and 700 nm) ensures accurate fluorescence detection and rejection of excitation light.
* **2:01 Customizable Illumination:** The Lumen Dynamics light source offers five individually controllable LED wavelengths (430, 475, 520, 575, 630 nm) with varying power outputs. The 575nm yellow LED is uniquely achieved using a white LED with filtering.
* **3:45 TTL Control:** The light source is controlled via a simple TTL interface, enabling easy on/off switching for each LED color.
* **12:55 Sophisticated Camera:** The system includes a 50-megapixel Kodak KAI-50100 CCD camera with a Peltier cooling system for reduced noise.
* **14:54 High-Speed Data Transfer:** The camera features dual analog-to-digital converters to manage the high data throughput of the 50-megapixel sensor, which is effectively two 25-megapixel sensors operating in parallel.
* **18:11 Possible Issues:** The video creator noted some potential issues with the camera, including image smearing.
* **18:11 Limited Dynamic Range:** The camera's sensor has a limited dynamic range, making it potentially challenging to capture scenes with a wide range of brightness levels.
* **11:45 Low Runtime:** Internal data suggests the system has seen minimal usage, with only 20 minutes of recorded runtime for the green LED.
* **20:38 Availability on eBay:** Both the illuminator and camera are expected to be listed for sale on eBay.
Here is the real transcript. What would be a good group of people to review this topic? Please summarize provide a summary like they would:
00:00:02 Honestly, it's the hallway track. Like
00:00:02 the biggest the spaces where I've
00:00:04 learned the most at CPPCON have been in
00:00:08 the evenings hanging out with people
00:00:09 over a drink or at dinner and just
00:00:11 chatting.
00:00:29 So, hi everyone. Uh,
00:00:29 thank you for being here today. I let
00:00:31 the la last people come over. Um, oh,
00:00:35 good. I have a I have a clock here.
00:00:37 That's perfect because I tend to
00:00:39 sometimes uh lose uh track of time. But,
00:00:43 uh, it's really great to have you here.
00:00:44 Uh, to have you all here and welcome to
00:00:46 the metaverse.
00:00:52 Oh, how you doing? I mentioned you in
00:00:52 today's talk by Herb. I'll tell you
00:00:54 later. Um, [laughter] so first of all,
00:00:57 really welcome to be for for you to be
00:00:59 here today. How many of you knows what
00:01:01 the the title reference to? Metaverse.
00:01:05 How how many of you know what the title
00:01:07 is referencing to? Keep your hands up.
00:01:10 Oh, okay. Okay. That's that's not bad. I
00:01:14 should have picked a better title. I've
00:01:15 been told. How many of you read the
00:01:18 abstract or how many of you know that
00:01:20 you're here for a talk on reflection?
00:01:22 Just want to make Okay.
00:01:24 >> [laughter]
00:01:26 >> Thank you. Okay, so first of all, I
00:01:27 apologize for the title. It looks like
00:01:29 uh yeah, I I should have probably not be
00:01:31 so tried to be so clever. So, um yes, so
00:01:35 meta is the new name space uh that we're
00:01:37 going to add for reflections to meta and
00:01:40 I'm going to talk more about this, of
00:01:42 course, and welcome. So, um yeah, uh I
00:01:45 I'm sure you can guess uh that this uh
00:01:48 picture was generated by AI. It's just
00:01:50 because
00:01:52 I I um used to draw but I don't have
00:01:55 time for this now because I'm a C++
00:01:57 developer but [laughter]
00:01:59 honestly I miss that. Uh so instead I
00:02:02 went to AI but I I am just trying to
00:02:04 express here the world of possibilities
00:02:07 that I I see as what reflection is. So I
00:02:11 hope this picture helps. Um a bit about
00:02:14 me. My name is Inbal Levy. Uh I don't
00:02:16 know if you've met me here already. we
00:02:19 talked uh if we haven't please come and
00:02:22 talk to me. Uh but I'm a C C++ software
00:02:25 engineer. I'm working on OS internals in
00:02:28 Microsoft as of around a year ago. Uh
00:02:31 I'm also an ISO C++ foundation uh
00:02:33 member. The C++ uh foundation is the one
00:02:37 behind this conference which is pretty
00:02:38 awesome. Uh and Boost Foundation board
00:02:41 member. I'm sure you all heard about
00:02:42 Beman by now hopefully. Yay. Yeah, we
00:02:45 have a person here in the front with a
00:02:47 t-shirt. Um, [laughter]
00:02:49 oh, the logo is amazing, by the way. I
00:02:51 don't know who did this logo, but it's
00:02:53 an amazing logo. [laughter]
00:02:56 I'm also a member of the ISO C++
00:02:59 committee as Israeli National Body Chair
00:03:01 and as library evolution workg groupoup
00:03:03 chair. So, library evolution for those
00:03:06 of you who doesn't know uh is the group
00:03:08 that is in charge of the uh features
00:03:11 that go into the standard library. It's
00:03:13 in charge of the design of the features.
00:03:15 So we have another group uh after us
00:03:17 that is in charge of the wording because
00:03:19 I'm sure you all already heard or know
00:03:21 that uh standard proposals go by you
00:03:25 have uh some implementation reference
00:03:27 you have some design and you have
00:03:29 wording because the wording is actually
00:03:31 what puts that into the standard. Cool.
00:03:34 So yeah so here's also a small photo of
00:03:38 what the standard looks like and you can
00:03:41 see here let's see if it works. Oh cool.
00:03:44 So you can see sorry here SD7 reflection
00:03:49 which is the domain group for reflection
00:03:51 the one that been incubating this uh
00:03:53 chaired by Hinatokova. Thank you so much
00:03:56 to her and you can see here the two
00:03:58 groups above core evolution and library
00:04:01 evolution. This is the language group
00:04:03 and this is the library group. They have
00:04:04 been incubating this proposal. So I
00:04:07 already tell you that this was one of
00:04:08 the largest proposals we had definitely
00:04:10 for 26 but maybe ever. Um and it had two
00:04:14 parts. It had library aspects and it had
00:04:16 uh sorry it had language aspects and it
00:04:18 had library aspects. And we're going to
00:04:20 review this uh as well. So just one more
00:04:24 call out uh um I hope that I didn't miss
00:04:28 any other reflection talk. If I have I
00:04:30 am sorry deeply but we had two talks in
00:04:32 this conference already. one by Barry
00:04:35 Rasvin which is one of the authors. I
00:04:37 will also bring him his name a lot
00:04:39 during the presentation. He is one of
00:04:41 the drivers of this proposal which is
00:04:43 really awesome and he he gave some
00:04:46 really cool examples and the second talk
00:04:48 from this morning by Herb Sutter um
00:04:51 about reflection C++ day defining rocket
00:04:55 engine and I do agree with Herb that
00:04:57 this is groundbreaking feature. So Herb
00:05:00 have shown a very very exciting things
00:05:02 that going to come up. I hope uh in the
00:05:04 future for reflection I'm going to go a
00:05:06 bit uh simpler and broader because my
00:05:10 aim for you today is to understand
00:05:13 reflection uh uh to like as thorough as
00:05:17 possible so that when you go out there
00:05:19 and write code you will be able to
00:05:21 understand uh the errors and the
00:05:23 problems that you stumble across. So
00:05:25 that's my goal for today not like Herb
00:05:27 to define the future or like Barry to
00:05:29 show you complex examples. Um but
00:05:32 welcome to my talk.
00:05:34 So uh that's kind of funny because uh
00:05:37 okay so anyway uh what do I mean when I
00:05:39 say reflection? Reflection is the
00:05:41 ability of a software to expose it
00:05:43 structure. I think Herb said something
00:05:45 very similar. But I also want to
00:05:48 emphasize that we're talking here about
00:05:49 static reflection. So who exposes this
00:05:53 structure? It's the compiler and it's
00:05:55 doing it on compile time. Now may sound
00:05:59 trivial but this gonna come up later and
00:06:01 there's going to be some uh riddles. So
00:06:04 keep this in mind. [laughter]
00:06:06 Um and a few disclaimer it's possible to
00:06:10 carry the data into runtime. So
00:06:11 basically if I have something and the
00:06:13 compiler uh generates strct have this
00:06:16 information I could technically leave it
00:06:18 in the binary but this is not what been
00:06:20 proposed for C++ 26. This is what we're
00:06:22 going to talk about here today. um and
00:06:25 it also may introduce security and other
00:06:27 issues. And this is not the focus of the
00:06:30 C++ 26 reflection proposal. But what we
00:06:34 do going to talk about today, so we're
00:06:36 going to talk about we're going to see
00:06:37 some intro to reflection. Uh we're going
00:06:39 to talk about a brief history of how we
00:06:42 got to today. Um we're going to talk
00:06:44 about latest proposal P2996.
00:06:47 This is the one that been voted in
00:06:50 Sophia not not that long ago. uh we're
00:06:53 going to see some users examples and as
00:06:54 I mentioned before as I'm library
00:06:56 evolution chair my focus and my interest
00:06:58 is on libraries uh that based on
00:07:00 reflections uh in the second part we're
00:07:03 going to talk about some impact on our
00:07:05 code bases so we're going to broad our
00:07:07 perspective and look at how is this
00:07:09 going to impact our code bases pipeline
00:07:12 generation and what next
00:07:15 so oh yeah one [clears throat] more
00:07:17 comment that I wanted to make um we have
00:07:20 few implementations s already in godbolt
00:07:23 which is really exciting. One of them
00:07:25 driven by Dan Katz uh he was from
00:07:28 Bloomberg now he's in Adobe. Thank you
00:07:30 so much for Don for doing this. Uh and
00:07:32 another one is by David Vanderv in EDG
00:07:35 and by the way by Wyatt Charles also
00:07:38 when in during his time on lock free
00:07:40 also started this implementation. So I'm
00:07:43 really grateful for all of them. So
00:07:45 let's look at a brief history.
00:07:48 Um the first place that I found that
00:07:51 mentions anything that have something to
00:07:53 do with reflection in relation to the
00:07:55 standard was 20 uh 2006
00:07:59 but this was a template-based reflection
00:08:01 library that Matush Colchic uh was also
00:08:04 getting gratitude in herbstock uh
00:08:07 started working on and it was called
00:08:10 mirror reflection library. Um, this
00:08:13 reflection library was something that
00:08:16 you might be familiar with as template
00:08:18 meta programming today, right? Um, we
00:08:21 also had some mentions of use cases for
00:08:23 compile time reflection by Mike Bartus.
00:08:26 Uh, I believe that was very insightful
00:08:28 to look into the future and some of the
00:08:31 use cases being brought up back then
00:08:33 even before we had the syntax that we
00:08:35 have today were serialization,
00:08:37 delegates, getters and setters and
00:08:39 customization points. I will give you
00:08:42 another hint.
00:08:44 One of those things is not I guess in a
00:08:48 sense one of those things we still
00:08:50 haven't delivered. So you look at those
00:08:52 things and try to think during the talk
00:08:54 what which of them has not been I guess
00:08:58 simply delivered or at least trivally
00:09:00 delivered. Um so as I mentioned Matus
00:09:03 Matus Colchic's library he was trying to
00:09:05 propose it into the standard and I'm
00:09:07 sure you all know that proposing
00:09:08 something into the standard takes some
00:09:09 times. he'd been working on this um but
00:09:12 as I said there were different uh uh uh
00:09:15 issues that came from the fact that this
00:09:17 thing relies on template meta
00:09:19 programming and another approval of that
00:09:21 was by uh boost HANA library that was
00:09:24 implemented by Louis Dion also trying to
00:09:27 observe uh uh the code and at that point
00:09:30 we realized that template meta
00:09:32 programming is problematic for
00:09:33 reflection anyone wants to shout out why
00:09:37 what's the problem with template meta
00:09:38 programming
00:09:42 You can also raise your hand if you
00:09:42 really want to. [laughter]
00:09:45 Yeah, Saka. No, no, you know what? Wait,
00:09:47 you you know that. Let's go with
00:09:48 Richard,
00:09:50 >> right? And Sakum, you were going to say
00:09:52 compile times. Yeah, because Sakum is by
00:09:53 the way one of the reflections um
00:09:56 experts that we have here. So feel free
00:09:58 to to talk to him. Um yeah, so yeah,
00:10:02 definitely compile time. Um, so, uh, so
00:10:07 that was an issue and therefore we
00:10:09 diverged in diver diverged sorry I'm not
00:10:12 a native English speaker so sometimes
00:10:14 I'm going to say things weirdly so if I
00:10:16 do please feel free to stop me and
00:10:18 correct me um we diverged into having a
00:10:22 u proposed syntax because if we can't do
00:10:25 this with templates that means that we
00:10:26 need syntax in the language so as you
00:10:28 can see there were multiple proposals
00:10:30 coming up trying to define this syntax
00:10:32 and by multiple people that I'm not
00:10:34 going to read their names but all of
00:10:36 them are in charge of what we have today
00:10:38 and at that point also came the question
00:10:40 of meta objects so how would you
00:10:44 generally how would you represent I have
00:10:46 a C++ program right uh this is let's say
00:10:50 I whenever I try to represent something
00:10:52 from the real world how would you
00:10:54 represent something from the real world
00:10:55 so the most classical example students
00:11:00 how just shout out like how would your
00:11:03 program look
00:11:07 What?
00:11:07 >> A lot of metadata.
00:11:08 >> Metadata, I guess. Yes. But where would
00:11:10 they save this metadata?
00:11:12 >> Yes. Classes, [laughter]
00:11:14 right? Because our go-to thing when we
00:11:18 try to represent things in the real
00:11:19 world, which is most uh commonly what we
00:11:22 try to do when we write programs, is
00:11:25 classes. So yes, this is exactly what
00:11:27 this is. Meta objects are basically
00:11:30 objects that represents parts of your
00:11:32 program in classes. Um I would also want
00:11:36 to talk okay I missed this very
00:11:39 important point of saying that Bern
00:11:41 started taking interest in this or maybe
00:11:43 he started taking interest before but
00:11:44 definitely published a paper which means
00:11:46 that the interest is increasing. Uh
00:11:48 David Senkle also published reflection
00:11:50 ts again in charge of a lot of the
00:11:52 syntax that we have today. So I want to
00:11:55 go back to what I said before. So we
00:11:58 represent parts of our program in
00:11:59 classes, right? Um so I I have a
00:12:05 variable and I have a type. How would
00:12:08 you put them in classes? Someone just
00:12:11 describe me. How would you write a
00:12:13 program for that? If I I have a I I have
00:12:15 a small program. It's int a equals 42. I
00:12:21 want to represent the parts of this
00:12:22 program. How would you write a program
00:12:24 to represent the parts of this program?
00:12:28 It's not a trick question. Very trivial
00:12:31 one.
00:12:37 >> Yeah. Yeah. Yeah. That's good. So, you
00:12:37 would basically do a hierarchy, right?
00:12:39 Something along those lines. Uh would
00:12:42 you Okay. So, you have the type int, you
00:12:46 have variable a. What would you do with
00:12:48 them? Would you put them in different
00:12:50 classes,
00:12:53 templates? What
00:12:54 >> intuition would be to have different
00:12:56 through all the different things.
00:12:57 >> Exactly. Thank you. Someone's [laughter]
00:12:59 someone someone uh took the bait.
00:13:03 Thank you person from the front row.
00:13:05 Yes, you would I would if I would have
00:13:08 think of a program that I want to
00:13:09 represent, I would probably do a
00:13:11 hierarchy with a type uh int and the
00:13:14 type will have different uh uh uh values
00:13:17 int or something else and they'll
00:13:18 probably inherit from that. But that is
00:13:20 not what we went for. We went for what
00:13:22 we'll call a um monotype design. And
00:13:26 what does it mean a monotype design? So
00:13:28 stood meta info that we're going to talk
00:13:29 about later is a single type represents
00:13:33 all the elements in your program by
00:13:35 value. I mean keeps values, right? To
00:13:38 represent all the elements of your
00:13:39 program. Anyone want to guess why is
00:13:42 that?
00:13:44 Go ahead. Uh person in the front row.
00:13:46 [laughter]
00:13:47 >> Yeah. If we introduce a new language
00:13:49 feature or remove some language feature
00:13:50 from the existing stop working
00:13:54 >> interesting interesting okay that's a
00:13:56 really interesting answer that I have
00:13:58 actually not thought of um what's your
00:14:00 name by the way
00:14:02 >> vine vine
00:14:04 >> vine thank you Vin that's a very
00:14:06 refreshing perspective well in I mean
00:14:08 technically we could extend this uh uh
00:14:11 tree of hierarchy but you're right that
00:14:13 would definitely create some burden for
00:14:16 standardizing for each new feature.
00:14:19 >> Oh, yeah. Sorry, sorry, sorry. Um, I'm
00:14:22 very tired because I I I I have a jet
00:14:24 leg. So, um, Vin have said that if we
00:14:30 have a hierarchy of those different
00:14:32 things to represent our program. Every
00:14:34 time we add a new feature, we need to
00:14:37 modify this our hierarchy, right? We
00:14:39 need a new type. We this is kind of a
00:14:41 implementation burden and opposed to
00:14:44 having a single type stood meta info
00:14:46 that contains values agreed like when
00:14:50 whenever we add type we need to you know
00:14:52 now maybe we have functions to deal with
00:14:55 this type maybe we have overload
00:14:56 resolution this is a lot of burden cons
00:14:59 comparing to a single type with a value
00:15:01 but uh another reason was the compiler
00:15:04 implementers uh suggested that that
00:15:06 would be simply too heavy. So we already
00:15:08 talked about compile times having a
00:15:10 hierarchy of types is more heavy in
00:15:13 terms of implementation and as and I'm
00:15:16 not a compiler implementer but according
00:15:19 to them that was another issue that's
00:15:21 why we went with student meta info but
00:15:23 actually after watching Barry's talk uh
00:15:26 from Monday I think I'm actually I I I
00:15:29 think I actually have another really
00:15:31 good reason for having meta info because
00:15:34 a single type because in a sense
00:15:36 reflection now when we have a single
00:15:38 type allows us to have a heterogeneous
00:15:42 design of like the algorithms are the
00:15:44 same but for multiple types those all of
00:15:48 those types or things or whatever are
00:15:50 represented by the student meta info. So
00:15:52 in the realm of reflection they are all
00:15:54 the same thing. So the algorithm that we
00:15:56 develop is actually applying to all of
00:15:59 them which is quite cool. So um uh so
00:16:03 before watching Barry's talk I did not
00:16:06 thought of this as an uh another benefit
00:16:09 or another positive aspect but I do
00:16:11 think of it now. Any other questions?
00:16:13 Any questions so far? By the way just
00:16:15 rambling here. Cool. All right. So yeah.
00:16:19 So another thing I wanted to bring up is
00:16:21 const expertness. So we did had const
00:16:23 expert getting into the language. Um and
00:16:26 some people uh have claimed things like
00:16:29 we can have everything as const expert
00:16:31 and all the logic and then we kind of
00:16:33 don't need new syntax but uh clearly
00:16:37 observing what constexert can do etc. We
00:16:39 did not see const expert as a complete
00:16:42 solution and I will show you uh more in
00:16:46 the [clears throat] in the future but we
00:16:47 do have more const expert things as a
00:16:49 result of the reflection proposal. So
00:16:52 naming as always naming is hard uh
00:16:54 syntax is hard but we've solved all of
00:16:57 that.
00:16:58 Um and again the question of uh single
00:17:02 object single type versus multiple types
00:17:04 came up latest in 2022
00:17:09 which is uh uh very late comparing to a
00:17:12 proposal that have been you know idea
00:17:14 that have been there for a while. But
00:17:16 then we uh reconfirmed the fact that we
00:17:18 want a single type object and 2023 we
00:17:23 got the proposal that we got for C++ 26
00:17:26 standard which is P2996 reflection for
00:17:28 C++ 26 which is very exciting. All the
00:17:31 names are here. Uh we had some very
00:17:34 interesting proposal uh about Python
00:17:36 binding using reflections and JavaScript
00:17:39 binding. Uh you can also see Adam Jagrt
00:17:42 Duncast Jagr is here by the way in the
00:17:44 conference. uh Saksham also wrote a very
00:17:46 interesting proposal talking about how
00:17:48 to use reflection for AI uh tagging um
00:17:53 or or versioning and all of those things
00:17:56 came after the proposal in 2023 came to
00:17:59 try to emphasize and explain what are
00:18:02 the use cases of reflection I think
00:18:03 those are very fascinating so we're now
00:18:06 two years later and I'm going to show
00:18:08 you the final version of uh reflection
00:18:10 as we got this into C++ 26 so draft have
00:18:14 not been officially signed but this was
00:18:17 voted into the standard which means that
00:18:19 it very likely that this would be the
00:18:21 final form. So I want to show you a
00:18:24 quick example to get to get the thing
00:18:26 started. So I have here a library type.
00:18:28 It inherits from two base uh classes and
00:18:33 I have the user code and I want in the
00:18:35 user code to observe this type and
00:18:39 basically sorry
00:18:42 and I basically want to ask a question
00:18:44 about this type. So I have here first of
00:18:47 all stood meta info I've mentioned
00:18:50 before this thing represents a
00:18:51 reflection uh expression and then I have
00:18:54 reflection expression and then I lift
00:18:56 the lib type into the reflection realm
00:18:58 and that's going to be a reoccurring uh
00:19:01 term during this talk because what we
00:19:03 actually do when we write reflection is
00:19:05 we write code in a different level uh we
00:19:08 we basically observe our programs and we
00:19:11 we lift the things in our program into
00:19:14 the reflection realm get an expression
00:19:16 that represent those things and then
00:19:18 query on them. So I think it's a very
00:19:21 very uh important point to uh notice and
00:19:25 then I take my reflection expression and
00:19:27 I can execute functions on it. Those
00:19:29 functions are coming from stood meta uh
00:19:32 uh namespace right uh so for example
00:19:34 basis of so I query basis of reflect
00:19:37 expression in place zero and what am I
00:19:39 going to get
00:19:42 >> you know that that's easy one
00:19:44 >> yes base one so yeah so we're going to
00:19:46 get the thing by the the order of
00:19:48 declaration which is also not trivial
00:19:50 right pretty cool
00:19:51 >> what do you get
00:19:52 >> base one
00:19:54 >> what is is it is it a type is it a tag
00:19:58 >> uh it's Uh, it's a it's a
00:20:02 >> it's the same type.
00:20:03 >> Okay. Okay.
00:20:04 >> Yeah. Yes. Exactly. Thank you.
00:20:07 >> Sorry.
00:20:09 >> Okay. So, yeah, I that was a spoiler
00:20:13 alert. [laughter] So, I'm now going to
00:20:15 show you all the objects of the
00:20:17 reflection propos uh components of the
00:20:20 reflection proposal. Um, there are a lot
00:20:23 of them. So, we start with reflect
00:20:26 reflection operator. There's going to be
00:20:27 splicers, uh, stood meta info object
00:20:29 that I talked about and bunch of meta
00:20:32 functions. We're not going to go over
00:20:33 all of those, but they exist there. And
00:20:36 if you look at them, you'll see things
00:20:38 that might resemble type traits. So you
00:20:41 might have seen things like is pure
00:20:43 virtual is all right, those kind of
00:20:44 things. And this is not coincidence. We
00:20:46 actually have a additional version of
00:20:48 the traits in the sto meta uh namespace
00:20:51 that use compiler magic that use uh that
00:20:54 are basically more powerful for
00:20:57 reflection. So that that is not uh
00:20:59 accidental. This talk also had different
00:21:02 versions. Let's see. Okay. So I've
00:21:05 updated this according to the version.
00:21:07 So if you look at the previous version
00:21:08 of this talk, those things were
00:21:10 modified. So I just wanted to highlight
00:21:12 them. Um yeah and uh we've been uh
00:21:15 modifying some names uh but yeah I'm not
00:21:17 going to go into this but if you look at
00:21:19 the slides later you can see the
00:21:21 difference. So let's start. I already
00:21:25 showed you an example. First of all I
00:21:27 wanted to say uh the reflection operator
00:21:29 now double carrot used to be a single
00:21:31 carrot. Unfortunately uh due to clash
00:21:35 with language that I would not repeat
00:21:38 name here [laughter]
00:21:40 we had to give up on this syntax which
00:21:42 is very unfortunate in my mind but now
00:21:44 we have the double carrot. It's also aka
00:21:47 known as uni bro. So feel free to use
00:21:50 this. This is not the official term. Uh
00:21:52 this term was not defined by me but it
00:21:54 was defined by uh JF uh which is
00:21:56 evolution chair. So I showed you before
00:21:58 the groups uh that's the nickname that
00:22:01 we give it. So yes we are now familiar
00:22:04 with the lift operator. And what does
00:22:06 the lift operator do? It shifts thing
00:22:08 into the meta um shifts uh from the uh
00:22:13 program realm into reflection realm. It
00:22:15 shifts into uh meta. So object can be
00:22:20 used as input for other reflection
00:22:22 utilities as we saw before. But what
00:22:25 happened? Sorry about that. [laughter]
00:22:27 What happened? What about this code?
00:22:29 Does this code gonna uh compile?
00:22:31 >> It's not.
00:22:32 >> Yeah, [laughter]
00:22:34 you have to like that's not fair. You
00:22:37 Yes, for people that have seen the
00:22:39 presentation before. Um, yes, we're
00:22:42 going to get an error. Uh, this does not
00:22:44 work because metatype variables must be
00:22:48 con expert. We're talking about
00:22:49 something that the compiler is doing.
00:22:50 So, compiler have to be able to hold
00:22:52 this thing. So this is one point that
00:22:55 you might going to get errors in your
00:22:57 compilers and start to get frustrating
00:22:59 spared. Think about this.
00:23:03 Second thing is the splicers. So we
00:23:05 already lifted something into the uh
00:23:07 reflection realm. We have int here. We
00:23:09 lifted it. What is int by the way in our
00:23:13 C++ programming language?
00:23:15 >> Yes, it's a type. Okay, cool.
00:23:19 So what would be this thing here? A
00:23:24 >> you get a yeah you you have a you have a
00:23:28 uh there there's a hint here. Yes, this
00:23:29 is a the reason I'm using type name is
00:23:32 because um in some in some uh scopes in
00:23:36 some uh areas of the program this might
00:23:39 be ambiguous. So we can basically you
00:23:43 could do just the splicers here and and
00:23:46 define like that uh reflect expression a
00:23:49 equal 42 that would uh get back as a
00:23:52 type but in some areas of the program
00:23:54 like for example if the name might be uh
00:23:56 ambiguous with namespace or something
00:23:58 else you need to use type name in order
00:24:00 to disinvigorate for the compiler cool
00:24:03 but the default is you don't have to uh
00:24:05 yes so we now have uh declared a right
00:24:11 with a type int but we don't write int
00:24:14 here we write reflection expression now
00:24:17 imagine this thing is not two lines of
00:24:19 code but is a different program passing
00:24:21 you something that you don't know what
00:24:23 this something is but you want to
00:24:25 instantiate it you could do it like that
00:24:27 because the type that is being passed
00:24:29 here is stood meta info so you'd have a
00:24:31 function that takes student meta info
00:24:34 another program for example uh when I
00:24:37 say program I mean another code another
00:24:39 whatever ever uh yeah one second let me
00:24:41 just finish my sentence in another uh uh
00:24:44 code uh initialize this reflection
00:24:47 expression but you don't know what the
00:24:48 reflection expression represent as a
00:24:50 type but you want to create one of these
00:24:51 so I do uh uh do a way hand waves here
00:24:56 because obviously I initialize it and if
00:24:58 it was something that doesn't fit to be
00:25:00 initialized with with 42 will be
00:25:02 compiler or other things but I do want
00:25:05 you to understand the power of this yes
00:25:07 rearch
00:25:08 >> so then Um if I understand correctly so
00:25:10 we're saying Rex par
00:25:11 >> is an expression
00:25:12 >> is an expression and I could
00:25:15 >> stood meta info in fact
00:25:17 >> yeah and I um I could pass it to another
00:25:20 function for it to use I would imagine
00:25:23 the function has to be constant then
00:25:25 >> yeah yeah it does it also have to
00:25:27 constal does it matter if I pass it by
00:25:30 reference r value pointer
00:25:34 >> uh let's get back to that
00:25:35 >> okay [laughter]
00:25:37 >> because it's an interesting question
00:25:38 Yes, I I would say by default pass it by
00:25:41 value. It's it's Yeah, but we will talk
00:25:44 about this because it's an interesting
00:25:45 question. Yes. Uh sorry, what's your
00:25:47 name?
00:25:48 >> Andri.
00:25:49 >> And Andri.
00:25:49 >> Yes.
00:25:50 >> Go ahead.
00:25:50 >> Is it legal to put unibrow in inside a
00:25:53 splicer directly?
00:25:55 >> Yes, it is. And Andreo have asked is it
00:25:58 legal to pass uh [laughter]
00:26:00 thank you volunteer for marking me to
00:26:02 repeat the question. That is very very
00:26:04 useful. I as I said volunteers sir are
00:26:06 very very useful. Thank you. I really do
00:26:09 appreciate it. Uh yes, it's legal. You
00:26:11 could you could this is a regular C++
00:26:14 syntax. Whatever you can do that kind of
00:26:17 makes sense. Take this expression and
00:26:18 put it somewhere else. It will work.
00:26:20 This is what Herb has tried to emphasize
00:26:22 as well. This is regular C++ syntax. So
00:26:25 all the rules you're familiar with are
00:26:27 also apply here. For example, could I
00:26:30 write this inside of a class uh uh like
00:26:34 body?
00:26:36 really um think about it a bit.
00:26:40 Okay, true. But we'll get back back to
00:26:43 that. Okay. Uh so splice exact I was
00:26:47 just trying to mess with you. So splice
00:26:49 extract the C++ expression back from the
00:26:52 student meta info. But then we can use
00:26:54 this in a C++ program. So again just to
00:26:57 emphasize we have our expression. What
00:27:00 is this thing?
00:27:07 Mana info object contains inf of int.
00:27:08 What is type name expression thing?
00:27:11 >> Yes, isn't it? Cool. You now know
00:27:14 reflection really really well. So now
00:27:16 when you're going to get errors,
00:27:18 [laughter]
00:27:18 you're going to be able to identify
00:27:20 them. But I I do mean it. All the rest
00:27:22 is is functions and you know how
00:27:24 function works. So uh we talked about uh
00:27:28 lift operator and about splicers. Let's
00:27:30 talk a bit about the stood meta info
00:27:32 object type. Who recognized this? What
00:27:35 is this?
00:27:37 I have
00:27:39 anyone worked on compilers here before?
00:27:41 It's a hint. Where's your hands?
00:27:49 [laughter]
00:27:49 >> Yes, that is true. Thank you for Sorry,
00:27:51 I forgot your name.
00:27:53 >> Max.
00:27:53 >> Max, thank you for the like five experts
00:27:56 that I have in the room, [laughter]
00:27:58 but thank you for keeping the the
00:27:59 presentation going. Yes, that is true.
00:28:01 Max has correctly identified this a can
00:28:04 you recognize which compiler this a is
00:28:06 from for by any chance it's small so I I
00:28:09 wouldn't like it's understandable if you
00:28:11 can
00:28:12 >> clank
00:28:13 >> yes that's a clank cool so yeah that's
00:28:16 the clank of this function here I just
00:28:18 realized this is quite dark I'm sorry
00:28:20 about that okay I hope that wasn't too
00:28:23 much of an issue in the previous slides
00:28:25 um yeah that's the clang a so we have
00:28:28 here things like function declaration
00:28:30 for the function on side right int uh
00:28:32 main uh we have a variable declaration
00:28:35 we have i we have int etc etc we even
00:28:38 have the uh l value r value definition
00:28:40 of this so yeah this is not by
00:28:43 coincidence stood meta info represents
00:28:46 uh or okay stood meta info can be as
00:28:49 equivalent of uh a node so it basically
00:28:52 we don't and in the standard we don't
00:28:54 specify implementation so we can't tell
00:28:57 implementers how to implement but I
00:28:59 would not be surprised if they uh put
00:29:01 this as a reference to their st. So uh
00:29:04 keep that also in mind. So type and type
00:29:07 aliases function and member functions
00:29:09 basically all the different things in
00:29:11 your program enumerators templates name
00:29:13 spaces etc. Look at this last line
00:29:16 expression uh with that sorry for the
00:29:19 width that can be only be evaluated at
00:29:22 compile time. So there's a restriction
00:29:25 stood meta info have to be conval.
00:29:29 So, yay. Now you know reflection really
00:29:31 well. I'm not going to give you any
00:29:33 hints. Is this code compiles? What? One
00:29:35 second for the question. Does this code
00:29:38 compiles?
00:29:46 >> Yeah. Yeah. Okay. Yeah. Yeah. Obviously,
00:29:46 if I'm asking, but yeah. Yes. Yes. You
00:29:48 already know the answer. This does not.
00:29:51 We don't have const expert. So, what
00:29:54 what about this int? I I don't know if
00:29:56 you remember in in the example. I don't
00:29:58 want to slide back in the example I
00:30:00 showed you before it was con exper int a
00:30:05 and then we'll uh the reflection
00:30:06 operator sorry it was constax per
00:30:09 reflection operator uh reflects uh int
00:30:12 lifts you know lift operator int and it
00:30:15 was const x exper and then the second
00:30:17 expression was also const x exper I have
00:30:19 here int array this is not const expert
00:30:22 con eval thing why does this thing works
00:30:35 Yes, exactly. So, yes, this is it's
00:30:35 confusing, right? Because I declare some
00:30:38 something that is not uncompile time,
00:30:41 but I still able to query the object of
00:30:44 this thing. So, reflect object, I will
00:30:46 give you the the uh information. It
00:30:48 takes an expression but this expression
00:30:50 in normal program what would this R
00:30:55 >> sorry that's actually a a bug r0 will
00:30:58 evaluate to
00:30:59 >> well R1 will also evaluate
00:31:02 any reference
00:31:04 >> is
00:31:05 >> I probably did a syntax error but yeah
00:31:07 it's a it's
00:31:08 >> it's a reference to
00:31:09 >> it's it's a it's zero it's zero you you
00:31:11 you access this element in the array
00:31:14 it's zero it's not initialized assuming
00:31:17 you know garbage put aside side etc. But
00:31:19 I can still reflect on this thing and
00:31:22 get the type right. So this is not
00:31:26 compile time thing but I can still get
00:31:30 information from this for example what
00:31:32 its type is. Yes, Richard.
00:31:35 >> But the result of a bracket operator is
00:31:39 but the type is an in reference like if
00:31:41 you have like because you can assign to
00:31:43 it, right? So it's not an RV value int.
00:31:45 It is it's an L value that or it's an L
00:31:48 value reference, isn't it? Because I can
00:31:51 if I have a bracket operator, I can say
00:31:53 >> it doesn't matter because it's if you
00:31:54 write this in a program, it will be
00:31:56 evaluated. So by the time I get to the
00:31:57 to the parenthesis, it is some some int
00:32:02 let's say zero. So I guess
00:32:03 >> it doesn't really it R value and L value
00:32:06 are not in play in this
00:32:09 >> reflected object um getting the type of
00:32:12 the expression or the result of the
00:32:14 expression.
00:32:15 >> It gets the type of the expression and
00:32:18 that's exactly the interesting thing
00:32:20 here. That's why I'm showing you this uh
00:32:22 uh function. Yes. Uh uh sorry
00:32:25 >> V.
00:32:26 >> Vine. Yes. Go ahead. But then I want to
00:32:28 continue. And it it's not a it's not a
00:32:30 tricky example. I was only uh showing
00:32:33 you u the reflect object uh usage. Yes.
00:32:36 So don't try like don't try to kind of
00:32:39 realize this is just a regular array.
00:32:41 Yes.
00:32:41 >> My question is
00:32:43 >> yeah.
00:32:44 >> Mhm.
00:32:46 >> Usually when you run it can defend
00:32:49 behavior when you try to access
00:32:50 something that is not initialized.
00:32:53 >> Yeah. Yeah. Okay. Please ignore the fact
00:32:55 that I did not initialize this array.
00:32:57 Please ignore the fact that I've in in
00:33:00 accidentally put here one when I
00:33:01 intended zero. Please ignore all of
00:33:03 those. It's just regular array with one
00:33:06 element. And I'm sorry uh for editing
00:33:08 this uh uh and not paying attention. Um
00:33:12 yes. Uh what's your name? Sorry. Uh no,
00:33:14 the person in the back. Tom. Yeah. Yes,
00:33:17 Tom. Um so
00:33:21 yes
00:33:26 could represent
00:33:26 >> right
00:33:27 >> and you had all these functions before
00:33:29 >> right
00:33:31 >> but like one downside of having a single
00:33:34 type is that not all functions really
00:33:36 are applicable to all of these different
00:33:39 things right
00:33:40 >> that is true and we have a mechanism to
00:33:43 to report errors
00:33:44 >> yeah that's and I will get to it like
00:33:46 >> yeah yeah I will get to I will get to
00:33:48 it. You're you're correct. Let's
00:33:50 continue. All right. So, stood meta
00:33:53 info. I have a another I I said there's
00:33:57 going to be like questions and and
00:33:59 riddles during this talk. So, I have
00:34:01 another riddle for you, but
00:34:02 unfortunately it's very dark. Okay. No,
00:34:04 it's going to work. Cool. I have a class
00:34:06 R, just a regular class. Nothing here
00:34:08 too complicated. I have a student meta
00:34:10 info uh result uh expression that
00:34:14 represents this R. And I have a print
00:34:17 and I basically ask about this class is
00:34:20 complete type. So anyone here doesn't
00:34:22 know what is complete type is what is a
00:34:24 complete type?
00:34:27 >> Uh okay. What? Sorry.
00:34:29 >> It's fully defined.
00:34:31 >> Yeah. Exactly.
00:34:32 >> It's defined when it's
00:34:33 >> Yeah. Yeah. Let's let's just say when I
00:34:35 declare this R compiler doesn't know how
00:34:37 to instantiate this thing until I tell
00:34:39 it what this R looks like. So at that
00:34:42 point it's not a complete type, right?
00:34:44 So what do you expect this rest uh to uh
00:34:48 uh this function meta function is
00:34:49 complete type to return
00:34:51 >> false. Yes, false true at that point.
00:34:55 Now I completed the type right
00:34:59 I have here so sorry so just to
00:35:01 emphasize uh the name of the expression
00:35:04 here is rest one okay that is important
00:35:08 I've completed the type and now now I
00:35:10 ask this question again and I declare
00:35:12 this uh uh res 2 and uh I ask the
00:35:17 question is complete type and then I I
00:35:20 save this into print two and then I ask
00:35:22 the same question on res one again save
00:35:25 it into print three. So now I have a
00:35:30 question for you. What will be printed?
00:35:34 So the first is false. I already gave
00:35:35 you that one.
00:35:38 >> True. True.
00:35:40 >> Wait. The first is false. Please
00:35:42 [laughter]
00:35:43 everyone. I know it's late. I know it's
00:35:45 the end of the day. I'm giving you the
00:35:47 first. The first is false.
00:35:49 >> So we have three prints. False. either
00:35:54 true or false and either true or false.
00:35:56 So, uh who thinks Yeah, go ahead. Uh say
00:35:59 the answers that you think
00:36:10 >> So, [laughter]
00:36:10 okay. So, how many of you think false
00:36:14 true true? Raise your hands. That is Max
00:36:17 in the back. There's a few people here.
00:36:20 Cool. Interesting. How many of you think
00:36:24 false true false?
00:36:30 Cool. [laughter]
00:36:30 I'm sorry. I'm really enjoying this. Uh,
00:36:33 so I thought like you all I expected
00:36:37 false, true, false. What did I get?
00:36:40 False, true, true. Why did I got false,
00:36:43 true, true? What is happening here? I
00:36:45 gave you already the hint. I actually
00:36:46 said that. Anyone remember what the sid
00:36:49 meta info kind of goes to by default
00:36:52 implementation?
00:36:53 >> A what happens in a represents our
00:36:56 program but it's been updated during the
00:36:59 reading of our program. So rest one here
00:37:04 despite the fact that we basically took
00:37:06 it sorry despite the fact that we took
00:37:08 it up ah terrible up here is actually
00:37:14 looks like a value type right that kind
00:37:16 of addresses your question Richard but
00:37:18 what is this thing it's actually kind of
00:37:19 a reference type to the a so yeah so
00:37:24 >> it's not okay uh that's a good question
00:37:27 uh let me think
00:37:30 I'm trying to think
00:37:32 >> yeah so it was a question is that an
00:37:34 implementation defined uh so in other
00:37:36 words is that actually specified in the
00:37:39 standard so I can tell you that we
00:37:41 actually specified in a yes so in a
00:37:43 sense we specified in the standard that
00:37:45 reflection is a stateful which means we
00:37:49 didn't exactly write it this way but
00:37:50 stateful means in opposed to stateless
00:37:54 that you you have uh you have rest one
00:37:58 and it states is get updated and I may
00:38:01 have confused that because I'm very
00:38:02 tired but you got my point. Yes, it's
00:38:05 not defined whether for example this
00:38:08 expression will return true or false but
00:38:10 it is defined how reflection would
00:38:12 behave and second point that I want to
00:38:14 make putting aside the specification is
00:38:17 that all implementations
00:38:18 uh would behave this way and this was
00:38:20 actually pushed back from uh
00:38:22 implementers because in a what would you
00:38:25 need to do in order to have rest one
00:38:28 return false um on the last uh yeah go
00:38:32 ahead
00:38:34 What would you need to do assuming
00:38:36 you're a compiler implement?
00:38:38 >> You have to like snapshot your
00:38:39 >> Yes, exactly. You have to snapshot, you
00:38:41 have to store, you have to kind of save
00:38:43 something, you increase the footprint of
00:38:46 your implementation and people were not
00:38:49 happy. So that's what we got. So I will
00:38:52 say I'm not super happy, but I also
00:38:54 accept and understand why and that's an
00:38:56 interesting thing to recognize. So
00:38:58 whenever you write programs and oh by
00:39:01 the way you could save of course you
00:39:03 could store uh the result of the like
00:39:06 print one still stores the result right
00:39:08 what I was asking about is the
00:39:09 evaluation of rests so pay attention
00:39:12 this is a bit subtle yes but I really
00:39:14 need to move forward
00:39:15 >> so what what's the implication for this
00:39:16 of putting in header files where at some
00:39:19 points in your program you've forward
00:39:21 declared a lot of classes and then you
00:39:23 fully declared classes like doesn't this
00:39:25 mean
00:39:25 >> exactly what you see here this could be
00:39:27 you cut this part into a header file. Oh
00:39:30 yeah, sorry. Richard was [laughter]
00:39:32 Thank you. Thank you. What's your name
00:39:34 person? Nice person
00:39:35 >> again.
00:39:36 >> Panos.
00:39:37 >> Pablo.
00:39:38 >> Panos.
00:39:38 >> Pabos.
00:39:40 >> Sorry. Whatever. Thank you so much.
00:39:43 Please come back. All the volunteers,
00:39:44 please come to the stage afterwards
00:39:46 because I want to thank you um properly.
00:39:49 Anyway, um yes. Uh this part is you
00:39:52 could wrap this thing into a header.
00:39:54 It's it's basically what you see here.
00:39:56 So if you ask this question earlier
00:39:59 before you exactly exactly that cool and
00:40:03 by the way I maybe forgot to mention
00:40:05 there's QR codes there gotbot links go
00:40:07 and play with those stuff so we talked
00:40:10 about reflection operator the lift
00:40:12 operator splicers meta info and how does
00:40:15 he it behaves we're now going to go over
00:40:18 each and every one of those meta
00:40:19 functions not really [laughter]
00:40:23 sorry I uh yeah not each of everyone But
00:40:26 there are tons of meta functions that
00:40:28 are really cool. You should go and check
00:40:30 uh that out and hopefully they'll be in
00:40:32 CP reference soon or maybe already are.
00:40:34 There's another thing that that came oh
00:40:37 sorry that came in late the const eval
00:40:39 block. It's exactly how you imagine it.
00:40:42 It's a const eval that you can open
00:40:44 parenthesis write stuff and close
00:40:46 parenthesis there'll be constal but I
00:40:48 don't go there because it's first of all
00:40:50 it's a late proposal that was appended
00:40:52 upon and second I don't have time. So
00:40:54 please look into the paper number if you
00:40:55 want. So meta functions I already showed
00:40:58 you a few of them. I want to show you
00:41:01 one more here. I have a equal 42. I have
00:41:04 meta name of you're already familiar
00:41:05 with all that. What do you expect to be
00:41:08 uh printed?
00:41:09 >> For this a
00:41:13 >> a interesting how about if I'll put this
00:41:15 in the name space.
00:41:17 Now what? Still a
00:41:19 >> still a okay so names in C++ are
00:41:23 ambiguous because do I want a fully
00:41:25 qualified name? Do I want? So instead of
00:41:29 name of we replace this to identifier
00:41:31 of. There's another function that's
00:41:33 called I forgot the name. Uh the
00:41:35 designate. Yes, thank you. Um
00:41:39 so name is not good
00:41:41 ambiguous. However, when I write logs
00:41:44 and things like that, I maybe do want to
00:41:46 have some more fine grain uh control
00:41:48 over this. We may extend this later, but
00:41:50 for now you get the identifier.
00:41:52 Identifier is the simplest identifier
00:41:53 thing in the closest scope. But this is
00:41:56 a interesting point right if I uh if I
00:41:58 if I want to keep this in mind for logs.
00:42:01 So all the meta functions except in
00:42:03 except info and return uh except for uh
00:42:06 some meta functions that uh reflect
00:42:10 value object and function that accepts
00:42:12 uh the t uh accept info and return
00:42:16 either string view or stood meta info
00:42:18 another meta info because you did
00:42:20 something to the type right or a vector
00:42:22 of stood meta info for example we saw
00:42:24 this in basis of or a boolean site size
00:42:27 dt um and source location and member
00:42:31 offset which is a new uh strct that we
00:42:33 added in order to uh query uh bit set
00:42:36 and stuff like that. Um uh the return of
00:42:40 offset of uh cool. So you're now
00:42:43 familiar with basically the majority of
00:42:46 the reflection proposal. So you can now
00:42:48 pull those go links and play with them.
00:42:50 I want to show you two more uh more
00:42:52 complicated functions. I do have kind of
00:42:55 kind of have time so I'll do it very
00:42:57 quickly. Um okay so substitute
00:42:59 substitute is the uh equivalent in
00:43:02 reflection realm for instant in a
00:43:04 template. So um I have here an array uh
00:43:09 sorry I don't know why it jumped but
00:43:13 uh yes sorry about that.
00:43:16 Okay, let's just start here. I have here
00:43:19 an array. Uh um
00:43:23 okay. Yes, sorry about that. Um let me
00:43:28 what was I trying to show here? Okay,
00:43:30 [laughter] reflect expression uh here is
00:43:34 the result of substitute function.
00:43:36 Substitute function takes arrays to the
00:43:38 array and takes u int and uh sorry the
00:43:44 sto meta info object that represents an
00:43:46 int and reflect value of three. So
00:43:49 reflect value I'll give you a hint is
00:43:52 like taking in I is like taking value
00:43:55 from your program and again throwing
00:43:57 this into the reflection realm. So
00:43:59 wherever I want to put three in my real
00:44:02 program I'll put reflect value of three.
00:44:04 So anyone wants to guess what this
00:44:07 function is basically doing this
00:44:08 substitute function takes array takes
00:44:11 type takes value which is three
00:44:17 >> exactly it's instant instantiation a
00:44:20 template now I have uh another question
00:44:25 where does it instantiate the template
00:44:35 is it here.
00:44:35 That's a hint.
00:44:41 >> Oh, I'm so sorry. I'm so sorry. I'm so
00:44:41 sorry. Okay. There's a call for
00:44:42 substitute and it returns something and
00:44:46 there's ne there the uh we we uh uh
00:44:50 splice the expression. Thank you. Thank
00:44:52 you so much. Sorry.
00:44:55 >> Did that help? We splice the expression
00:44:57 that we returned from substitute and
00:45:00 call my array one.
00:45:04 >> What is spliced?
00:45:06 >> Spliced is the this operator that I've
00:45:08 shown you before that basically takes
00:45:10 things back from this is this thing is a
00:45:12 stood meta info object.
00:45:15 So the result of substitute is stood
00:45:16 meta info object and here I splice it
00:45:19 back into uh our real uh program world.
00:45:25 Yes, thank you. Who said that?
00:45:28 >> All of you. [laughter]
00:45:29 Oh my god. This is a group of very smart
00:45:32 people. Why? Why? Why do you think that?
00:45:35 By the way,
00:45:37 it costs, right? It costs. So yes, here
00:45:40 what I do at line one is basically I
00:45:44 just hold a stood meta info object that
00:45:48 represents something that when I send it
00:45:51 back to the program world is instant is
00:45:54 is a type. So only here I actually get
00:45:57 the call what you used to look at uh
00:45:59 array uh int three is that and this is
00:46:04 just preserving it's preserving the
00:46:07 information so that later okay so
00:46:09 substitute returns something which
00:46:11 preserves the information so that later
00:46:13 you can create the type so yes this is
00:46:16 tricky it's only later instantiate which
00:46:18 is pretty cool it's delayed it's uh
00:46:20 useful it's effective um here another
00:46:24 example I have here some strcts um and
00:46:27 uh this strct takes an int and
00:46:31 uh
00:46:33 imagine that this is just declaration of
00:46:35 strct s colon
00:46:39 what would happen here
00:46:41 I substitute right and I'm not going to
00:46:45 show you the next thing it's good
00:46:47 because it's actually have the comment
00:46:48 on showing what it shows so I'm actually
00:46:51 utilizing the fact that you don't see
00:46:52 what's what's going to happen next
00:46:54 what's going to happen when I try to
00:46:55 splice this.
00:47:01 >> I guess by what you said that the splice
00:47:01 would be okay, but then the
00:47:02 instantiation would fail.
00:47:04 >> No, no, no. The splice is the Okay.
00:47:07 >> Sorry. I'm sorry. That the substitute
00:47:08 would pass.
00:47:09 >> Exactly. Exactly. That what would
00:47:11 happen. Thank you. This is awesome. Uh
00:47:14 so, uh sorry, what's your name?
00:47:16 >> J.
00:47:17 >> J. Jay Jay have said the substitute
00:47:20 would succeed the instantiation would
00:47:23 fail. Cool. All right. Awesome. Another
00:47:26 edge cases. So now we're talking about
00:47:29 extract. I I would uh yeah if you have
00:47:31 questions I know it's uh it's very
00:47:33 interesting and cool. Uh we have about
00:47:35 12 minutes and I do want to go over a
00:47:36 lot of things. So try to keep your
00:47:38 questions to the end and I'll try to
00:47:39 take a few of them and if not please
00:47:40 catch me on the break. So extract what
00:47:42 does extract do? It's the equivalent in
00:47:44 reflection realm for extracting values.
00:47:47 So again, I'm sorry about the uh weird
00:47:51 um um animation I have here. Expression
00:47:55 extract int uh and reflect value three.
00:48:01 So what would happen here? Extract.
00:48:05 What is this
00:48:08 >> type?
00:48:09 >> Right? It's int. So what do I do? I tell
00:48:12 extract that and you can you can notice
00:48:16 that this is a template function that I
00:48:18 take an int and there's a reflect value
00:48:21 three here what this thing returns
00:48:25 s meta info object represent three what
00:48:28 would happen on the next example
00:48:32 I have expression
00:48:34 and I extract sorry oh that's better
00:48:36 sorry about that animation was a bit
00:48:39 weird second uh line and you can already
00:48:42 see the answer.
00:48:43 >> Yeah,
00:48:44 >> fails, right? Why does it fail? Because
00:48:47 I can't extract three from a string. So
00:48:51 extract, I think Barry said it really
00:48:53 well. It just like uh any cast uh just
00:48:57 like extracting value from a cast. So
00:49:00 basically um you can extract by giving
00:49:03 the type from stood meta info uh object
00:49:08 the thing that you want to extract from
00:49:10 and you're going to get back the uh
00:49:12 type. Cool.
00:49:14 Continuing type trait I already talked
00:49:16 about. So I'm going to skip this. I want
00:49:18 to talk uh I don't have a lot of time. I
00:49:20 have 10 minutes. I want to talk about
00:49:22 function param names uh very quickly and
00:49:24 then I'm going to move to other topics
00:49:26 that I had in mind. So I have a function
00:49:28 here print param k okay and it takes a
00:49:31 stood meta info r and a size of params
00:49:34 and it basically returned the name of
00:49:37 parameters of r in the location k so
00:49:43 imagine now that r is basically a
00:49:46 function so I give it a function and I'm
00:49:49 asking give me back the name of all the
00:49:52 parameters that that's the that's the
00:49:54 gist of it so I now have a function
00:49:57 funk with int first and int last and I
00:50:00 have another uh that's the function
00:50:03 declaration and then I have the function
00:50:06 definition function definition is int n
00:50:08 int ln I think I called it here what
00:50:12 would be returned from the function that
00:50:15 I showed you before that basically takes
00:50:17 a function and prints it parameters
00:50:21 so just a reminder I have
00:50:25 uh so sorry about that I have int n int
00:50:28 ln and in the second in the function uh
00:50:30 declaration I have first and last
00:50:37 >> yeah you don't know right why do you
00:50:37 don't know because it's not like well
00:50:39 defined it's not we don't have any rules
00:50:42 in C++ that tells you what this thing
00:50:45 needs to return because there's no
00:50:47 canonical name for funk params right so
00:50:50 if I have a declaration and definition
00:50:52 there's no canonical name for those
00:50:53 things that means that we need to make a
00:50:55 decision ision here, right? So, we could
00:50:57 do multiple things. We could say we go
00:50:59 with the last declar the last names that
00:51:02 we see, which is in this case would be n
00:51:04 and ln. We can decide that we go with um
00:51:08 some weird array of all the names that
00:51:12 this int had. We could decide that if
00:51:15 this thing doesn't have the same name,
00:51:17 we fail to compile. We could decide
00:51:19 bunch of things. Um because I don't have
00:51:21 a lot of time,
00:51:24 I will introduce you to all the options
00:51:26 that we can have. So I I I there's tons
00:51:31 of other options. But what we had when
00:51:33 we discussed this in the committee and
00:51:35 we discussed this exact thing in the
00:51:37 committee in library evolution because
00:51:38 this is a a a library function, right?
00:51:41 It's a library function. There's
00:51:42 equivalent library function doesn't
00:51:44 matter inside of reflection that takes a
00:51:46 function and needs to return its param
00:51:48 names. So we had multiple options. We
00:51:50 have compile.
00:51:53 No one knows what returns. So if I had
00:51:55 clang like it's implementation defined.
00:51:58 In other words, if I have clang and it
00:51:59 and I compile it in clang, I get one
00:52:02 answer. I compile it to GCC, I get
00:52:03 another answer. I can enforce consistent
00:52:06 naming, which means that if I have
00:52:09 different names, I do not compile. Or I
00:52:11 can maybe mark with an attribute some of
00:52:15 those declarations, definition,
00:52:16 whatever, and say this one's the
00:52:17 canonical one. And I care about this
00:52:19 one.
00:52:21 I oversimplified the other options.
00:52:24 Three options. If you would have sit in
00:52:27 a room, what would you have voted? Who
00:52:29 would have voted for compiling no
00:52:31 guarantees application would be that if
00:52:33 you have a log file from one compiler
00:52:35 and you try to fit it into a different
00:52:37 compiler, you it's it doesn't fit. Who
00:52:40 would vote for the first one?
00:52:43 Okay, not many people. Who would vote
00:52:45 for the second one? Enforce consistent
00:52:47 naming which means fail.
00:52:49 Okay, cool. Who would vote for marking
00:52:52 by attributes?
00:52:54 Okay, cool. Well, I I kind of like
00:52:56 marking by attribute, but what we went
00:52:58 with is actually enforce consistent
00:53:00 naming.
00:53:02 So, um it have implications, right?
00:53:05 Someone want to think about the
00:53:06 implication of this thing.
00:53:08 >> Existing code.
00:53:09 >> Yes, it breaks
00:53:11 >> introduce reflection to existing code.
00:53:12 Yes, Tom is saying you can't introduce
00:53:14 reflection to existing code that that
00:53:17 violate this rule. But no one ever told
00:53:19 you that you have to use the same names
00:53:20 in definition declaration. In fact, some
00:53:23 companies prefer not to for different
00:53:25 reasons. Some companies have the
00:53:27 declaration with no names and then the
00:53:30 definition with names and that's a valid
00:53:31 use case. So, [laughter]
00:53:34 but yeah. Yeah, I we went with this. I
00:53:37 think uh I will I can talk to you about
00:53:39 this later but I think this decision was
00:53:41 actually uh a good one uh considering
00:53:44 but it still have implications. So
00:53:46 unfortunately unfortunately it keeps
00:53:48 happening to me. I do not have time to
00:53:50 talk about reflection logger example. Um
00:53:54 so please look into uh the um example
00:53:57 here um afterwards. um it would do
00:54:01 exactly what you had imagine but with
00:54:03 all the tools that we saw oh sorry go
00:54:05 ahead with all the tools that you've saw
00:54:08 uh today and I trust you all to be able
00:54:10 to to uh we one more addition that you
00:54:13 can actually report uh constax where
00:54:15 value is kind of a utility that is also
00:54:18 only in EDG that is not standardized
00:54:20 that allows you to basically print from
00:54:22 the compile time by the way one more
00:54:24 thing I want to mention jetprin have a
00:54:27 com um IDE that debugs compile time as
00:54:32 of a few days ago, which is super
00:54:34 awesome. Now that we have reflection, we
00:54:37 really need this thing, right? How
00:54:39 exciting is that? Okay, cool. So, I'm
00:54:42 going to skip this one as well.
00:54:44 Unfortunately, I will just say in a few
00:54:47 words, I have a talk about customization
00:54:48 points. Reflection was considered as a
00:54:51 customization point option. I my
00:54:54 personal opinion is that you don't want
00:54:56 to use reflection as customization
00:54:58 point. customization part is how you
00:54:59 basically modify your library to fit to
00:55:02 your user types if you want to if you
00:55:03 want to have like specialized behavior.
00:55:06 Um I don't think that reflection fits
00:55:08 that because it's quite complicated but
00:55:11 it could be used for that. So in my
00:55:13 personal opinion we should have more
00:55:15 customization points but reflection
00:55:17 allows you to do that but in a
00:55:19 complicated way. So jumping forward the
00:55:23 example I talked to you about before and
00:55:26 you identified correctly is breaking
00:55:28 user code. So if I so far had my
00:55:31 pipeline and I had compiled something uh
00:55:34 into a library and I linked it with my
00:55:37 main and I found out on linker that I
00:55:40 have a problem
00:55:43 maybe and I could do version controls
00:55:45 with macros and things like that in the
00:55:47 source code
00:55:49 now because reflection breaks existing
00:55:52 code I would not get to the linker I
00:55:54 would stop in the compiler I would get
00:55:56 errors and that for example imagine I
00:55:59 work in a company. I write logger
00:56:00 library. My logger library works
00:56:02 perfectly well on most of the code. But
00:56:05 someone from the other team takes my
00:56:07 logger library which is written in
00:56:08 reflection. This is just like template
00:56:10 meta program by the way. This is like
00:56:11 just like template header right in a
00:56:13 sense that it it needs to see the source
00:56:15 code during compilation. But I take it,
00:56:18 I give it to another uh team and and
00:56:20 they can use my logger library because
00:56:22 they don't have this uh applied this
00:56:24 restriction applied in their in their
00:56:26 code or maybe they need to now modify
00:56:28 all the uh names. Fine. So that's
00:56:31 something to think about. Um
00:56:38 [sighs and gasps] okay, [laughter]
00:56:38 I have three minutes. I have a bit more
00:56:40 uh things to talk about. And I'm very
00:56:42 excited, by the way, for all of your
00:56:43 questions.
00:56:45 So instead of uh showing you all the
00:56:47 slide I will tell you that I had some
00:56:50 consideration whether do we even need
00:56:52 reflection which is code generation
00:56:53 considering the world of AI. So I have a
00:56:56 agent I have AI I ask like in this
00:56:58 particular example I generate a parser
00:57:02 I can give it a code and ask for code
00:57:04 generation. Why do I need reflection for
00:57:06 if I could just do this by eye? It's an
00:57:10 interesting question right?
00:57:12 How many of you think that we still need
00:57:14 reflection?
00:57:16 [laughter]
00:57:16 Wow, awesome. I want to talk to you all
00:57:19 afterwards. How many of you think that
00:57:22 we don't need reflection
00:57:24 anymore in the world of AI? Okay. Well,
00:57:28 I agree with the with you all that we
00:57:31 still need reflection. I cannot promise
00:57:33 what will be in the future, but for now,
00:57:35 I do agree with you. And I can give you
00:57:37 one very very strong reason is because
00:57:40 the output coming from AI is not
00:57:42 consistent. And when I use reflection
00:57:44 feature, I know for a fact that what I'm
00:57:47 going to get each iteration of running
00:57:49 this is consistent. So not going into
00:57:53 the weird things that they generated
00:57:55 which I wanted to show you all here.
00:57:58 It's inconsistent.
00:58:01 Second thing I wanted to talk about is
00:58:03 Rust. So it was brought up in a in a
00:58:06 panel. Rust does have utility of
00:58:09 reflection. It's have procedural macros
00:58:12 which is I guess is like you you could
00:58:16 refer to macros as a as a like something
00:58:19 that you can think of as equivalent
00:58:21 despite the fact that it doesn't uh look
00:58:23 the same way. It doesn't work the same
00:58:25 way because it's actually being observed
00:58:26 by the compiler. And it al they also
00:58:28 have the scene library which is library
00:58:31 that inject tokens into the a Okay, so
00:58:35 we already talked about a. So we have
00:58:38 like the stream of uh tokens that are
00:58:41 your program and you now need to get
00:58:43 into the stream inject something into
00:58:44 the stream in order to reflect to
00:58:47 basically read information. That's what
00:58:49 it does basically and then or or uh
00:58:52 generate and then give back the stream
00:58:55 continue with your program. So I said in
00:58:58 the panel from my in my opinion in my
00:59:00 opinion and that's my personal opinion
00:59:02 that's less good of a user interface.
00:59:05 Now could claim that the markers
00:59:07 themselves are uh intuitive and
00:59:09 comfortable I for so the generation part
00:59:12 is actually more intuitive. I think the
00:59:15 reflection part the part that you
00:59:17 observe is less intuitive. That's my
00:59:19 personal opinion. Uh but that that is an
00:59:22 interesting thing to consider. Another
00:59:24 thing I wanted to talk about is the
00:59:26 errors. We talked about errors. Oh my
00:59:28 god, I have no time. We talked about
00:59:30 errors. So we have new feature that
00:59:32 comes with reflection. This new feature
00:59:34 is uh constexer ex uh exceptions. That
00:59:39 means your reflection uh code can throw
00:59:42 exceptions that are basically only valid
00:59:47 in compile time. Those exceptions cannot
00:59:49 leak to line to runtime, but they
00:59:52 provide you a better way to notify the
00:59:54 user of the error. So basically like an
00:59:57 error message like you would have used
00:59:58 with a regular exception in a regular
01:00:00 code. So you can catch them, you can
01:00:02 print them. Pretty cool, isn't it? I
01:00:06 think it's really cool.
01:00:08 >> What?
01:00:10 >> No, no, just try catch. And there if you
01:00:13 evaluate this in a const block, that
01:00:15 will be const.
01:00:18 Okay, so this is awesome. So yeah to
01:00:20 answer the question from before the
01:00:22 things that can happen when your uh when
01:00:24 your reflection fails and I already
01:00:26 mentioned that with the example is
01:00:28 either compiler doesn't compile or you
01:00:32 get const exception exception either
01:00:36 been caught and printed or if not it
01:00:39 will be terminated the program will be
01:00:41 terminated the compiler will fail. So
01:00:43 this is what can happen with reflection.
01:00:46 So what should we expect from reflection
01:00:49 libraries? I think Herb was actually
01:00:50 talking about this really well. I think
01:00:52 the realm of libraries the the realm of
01:00:55 possible libraries have just opened in
01:00:57 front of us and I'm being in library
01:00:59 evolution uh group library evolution
01:01:01 chair. I expect to see a bunch of
01:01:04 proposals coming our way that were
01:01:06 originally meant to go to uh evolution
01:01:09 to the language because now we're going
01:01:11 to have so many of you writing code in
01:01:14 reflection code that you can test on
01:01:17 your compilers. You don't need to be
01:01:18 compilers developers anymore to be able
01:01:21 to modify the language. And you're going
01:01:23 to write libraries in reflection and
01:01:26 they're going to work and do observation
01:01:28 everything else. and you're going to
01:01:29 come to our group and propose this as uh
01:01:32 utilities for the standard. So, first of
01:01:34 all, I welcome you all and I have my
01:01:36 email in the in the end because I really
01:01:38 really looking forward to the world of
01:01:40 possibilities that we're going to have
01:01:41 with this feature. Um, and yeah, and I
01:01:44 need to hire more people to help.
01:01:47 So, that's it. So, I think that's
01:01:49 actually summarized my talk. Uh, last
01:01:51 thing I wanted to shout out, you already
01:01:53 seen, I hope most of you at least saw uh
01:01:56 Daisy's talk about AI. If you want to
01:01:58 learn more about AI, I didn't even had
01:02:00 time to touch it, but I was trying to,
01:02:02 but if you want to learn more, go there.
01:02:04 Um, Hannah Dova, SG7 chair, she also is
01:02:07 in charge of a lot of the constax uh
01:02:10 things that we saw um that a lot of the
01:02:12 coner utilities that were added with
01:02:14 reflection. So, if you catch her at some
01:02:16 conference, thank her because she did so
01:02:18 much work. And I'm very excited about
01:02:21 having reflection in 26 after I guess 20
01:02:25 years or so that we actually looked at
01:02:27 this idea and observed it. And last but
01:02:30 not least, I want to thank core CBP user
01:02:32 group that's my local user group in
01:02:34 Israel that reviewed this. Hana, Matush,
01:02:38 David, Corentan, Luis, Adi uh that all
01:02:41 uh gave me feedback on the talk or gave
01:02:43 me input on the things that you've seen.
01:02:46 And I want to thank all the reflection
01:02:49 paper authors and contributors and I
01:02:52 probably missed some of them but I
01:02:53 really really uh think that they are in
01:02:56 charge of what we got here today. So
01:02:58 thank you all for being passionate about
01:02:59 C++. Thank you very much.
01:03:03 [applause]
01:03:11 Apologize I had to skip a few of the
01:03:11 last slides but you can see the
01:03:12 presentation. And most of all, I want
01:03:14 you to email me for anything that you
01:03:17 have in mind. And if you have new
01:03:18 reflection library proposals, please
01:03:20 feel free to reach out. I'm excited
01:03:21 about this. Thank you.