On Monday, 26 October 2020 at 11:14:47 UTC, frame wrote:
Did not find this topic:
I have an interface and some wrapper classes that use it. The
wrapper's methods should accept variadic arguments. The runtime
should only work with the interface, trying casting to a
wrapper is not an option, because it's a plugin design.
- defining a variadic template in wrapper does not work,
because we are working with the interface only and compiler
complains method is not callable with argument X
- defining a variadic template without body in interface causes
linker errors, which makes sense somehow
- defining a variadic template with body in interface could
work if the compiler would get the right "this" type but sadly,
"this" refers to interface and also "this T" refers to
interface too.
Is there any way to get this working? I know, I could use a
known object to feed the arguments and use that instead - but I
want to keep things simple as possible.
Templates can't be virtual, so even if they can be defined in an
interface, you can't override them in a class that implements
said interface - the implementation needs to be in the interface
itself.
This makes sense if you consider that the user of the interface
has no knowledge of the types that implement it, and vice versa:
the implementing class has no idea which instantiations to make,
and the user has no idea which implementing classes to create
instantiations for. Templates require that the user have full
knowledge of the templates to be instantiated.
There are some workarounds of sorts, but they depend heavily on
what you're trying to achieve. Can you use an array of
std.variant.Variant, for instance?
--
Simen