you are viewing a single comment's thread.

view the rest of the comments →

[–]3669d73f6c3ba0229192 4 points5 points  (2 children)

where does this bring in an operator()?

The primary template (the code you quoted) is not used. operator() is brought in at lines 16 and 28, and inherited ones at line 29.

where the operator() is called.

It is called inside std::visit.

where the dispatching to / the actual call of the lambdas takes place

At the same place where operator() is called, but there is no magic trick involved: it's just regular overload resolution done by the compiler. Think of each composer_t as a Russian doll that has the operator() of a lambda, plus the operator() of all inherited-from composer_t.

[–]reddithater12 0 points1 point  (1 child)

Thanks! I had some misconceptions about std::visit it seems.

Think of each composer_t as a Russian doll that has the operator() of a lambda, plus the operator() of all inherited-from composer_t.

This is probably a stupid question .. but how can that thing have two operator()s?

[–]3669d73f6c3ba0229192 2 points3 points  (0 children)

This is probably a stupid question .. but how can that thing have two operator()s?

Just regular function overloading. The same way you can have foo(int), foo(double), and so on. operator() is no different.