On Tuesday, 27 December 2016 at 02:05:27 UTC, Ali Çehreli wrote:
On 12/26/2016 02:04 PM, crimaniak wrote:
So my main question: how it is possible to do such thing?
Just to make sure we're on the same page: :)
* There is 'interface' in addition to 'class'
Yes. I want it for structs exactly.
* If all you want is to check, then you can write template
constraints by following the example of std.range.isInputRange.
Interface implementation has a significant advantage over
template constraints for implementation break case. With
interface I have one relevant error on the implementation stage.
With template constraints I have many less relevant errors on the
usage stage. It's just different types of contract.
With that aside, what you need is generally achieved by a mixin:
@implements!I1
struct S1
{
// ...
}
template ValidateInterfaces() {
// Go through all members of the module here
// Identify the ones having the 'implements' UDA
// The useful tools here are
// __traits(getAttributes)
// __traits(allMembers)
// __traits(getMember)
}
mixin ValidateInterfaces;
Thanks, this is a way. The only problem user can forget to call
this mixin. It would be useful to have module-wide compile-time
variables, in this case it's possible to call ValidateInterfaces
one time from first @implements instance and user don't have to
write it at every module.