digitalmars.D - Extending UFCS to templates
- Andrej Mitrovic (23/23) Mar 02 2012 I thought I'd be cool if we could use UFCS for templates. For example
I thought I'd be cool if we could use UFCS for templates. For example instead of this: template isOneOf(X, T...) { static if (!T.length) enum bool isOneOf = false; else static if (is(Unqual!X == T[0])) enum bool isOneOf = true; else enum bool isOneOf = isOneOf!(Unqual!X, T[1..$]); } void test(T)(T t) if (isOneOf!(T, int, double)) { } void main() { test(1); } We would be able use code like this: void test(T)(T t) if (T.isOneOf!(int, double)) // UFCS (or maybe Uniform Template Instantiation Syntax? :p) { } A far-fetched dream?
Mar 02 2012
On Friday, 2 March 2012 at 21:18:31 UTC, Andrej Mitrovic wrote:I thought I'd be cool if we could use UFCS for templates. For example instead of this: template isOneOf(X, T...) { static if (!T.length) enum bool isOneOf = false; else static if (is(Unqual!X == T[0])) enum bool isOneOf = true; else enum bool isOneOf = isOneOf!(Unqual!X, T[1..$]); } void test(T)(T t) if (isOneOf!(T, int, double)) { } void main() { test(1); } We would be able use code like this: void test(T)(T t) if (T.isOneOf!(int, double)) // UFCS (or maybe Uniform Template Instantiation Syntax? :p) { } A far-fetched dream?From what I understand, UFCS should work on templates once properly implemented. A.someNonExistentThing(params) basically becomes .someNonExistentThing(A, params) I think that (at least in the current UFCS pull request) it *should* work, but I've never actually tried it.
Mar 02 2012
Andrej Mitrovic <andrej.mitrovich gmail.com> wrote:I thought I'd be cool if we could use UFCS for templates. For example instead of this: template isOneOf(X, T...) { static if (!T.length) enum bool isOneOf = false; else static if (is(Unqual!X == T[0])) enum bool isOneOf = true; else enum bool isOneOf = isOneOf!(Unqual!X, T[1..$]); } void test(T)(T t) if (isOneOf!(T, int, double)) { } void main() { test(1); } We would be able use code like this: void test(T)(T t) if (T.isOneOf!(int, double)) // UFCS (or maybe Uniform Template Instantiation Syntax? :p) { } A far-fetched dream?This only works for types. Values (thus, aliases) would be ambiguous. 1.isOneOf!(2, 3) // could be isOneOf!(1, 2, 3) // or isOneOf!(2, 3)(1)
Mar 03 2012