DEV Community

loading...

Discussion on: That `overloaded` Trick: Overloading Lambdas in C++17

Collapse
misiaszek profile image
Marcin Misiaszek • Edited

This also works without deduction guide:

template<class... Ts> struct overload : Ts... {
  overload(Ts...) = delete;
  using Ts::operator()...;
};
Thread Thread
maxxon profile image
Ma-XX-oN

I'm confused with this part:

        Print{ // (2)
            [](const char* str) { puts(str); },
            [](int i) { printf("%d\n", i); }
        }

The braces indicate a constructor call, but there is none. There is a non-member helper template though, but it has no body. So, what's happening here?

Thread Thread
maxxon profile image
Ma-XX-oN

It's not a non-member helper template, it's a user defined deduction guide. See this article:

arne-mertz.de/2017/06/class-templa...

Thread Thread
misiaszek profile image
Marcin Misiaszek

It works also without deduction guide and the 'using' fix is for g++. 'operator()' cannot be ambiguous in visitors but gcc is very careful with overloading derived functions. In clang we can easily have the same results with minimal code (checked output assembler with Compiler Explorer):

template<class... Ts> struct overload : Ts... {
  overload(Ts...) = delete;
};

There is needed aggregate Initialisation + variadic templates.