UDAs - Restrict to User Defined Types?

H. S. Teoh hsteoh at quickfur.ath.cx
Thu Nov 8 22:11:43 PST 2012


On Thu, Nov 08, 2012 at 09:37:00PM -0800, H. S. Teoh wrote:
> On Thu, Nov 08, 2012 at 11:51:29PM -0500, Nick Sabalausky wrote:
[...]
> > Those are only half-solutions as they only prevent false-negatives,
> > not false-positives. Plus, there's nothing to prevent people from
> > forgetting to do it in the first place.
> 
> IOW, you want the user-defined type to declare that it's an input
> range, and not just some random struct that happens to have input
> range like functions?
> 
> What about modifying isInputRange to be something like this:
> 
> 	template isInputRange(R) {
> 		static if (R.implementsInputRange &&
> 			/* ... check for input range properties here */)
> 		{
> 			enum isInputRange = true;
> 		} else {
> 			enum isInputRange = false;
> 		}
> 	}
> 
> Then all input ranges will have to explicitly declare they are an
> input range thus:
> 
> 	struct MyInpRange {
> 		// This asserts that we're trying to be an input range
> 		enum implementsInputRange = true;
> 
> 		// ... define .empty, .front, .popFront here
> 	}
> 
> Any prospective input range that doesn't define implementsInputRange
> will be rejected by all input range functions. (Of course, that's just
> a temporary name, you can probably think of a better one.)
> 
> You can also make it a mixin, or something like that, if you want to
> avoid the tedium of defining an enum to be true every single time.
[...]

Here's a slight refinement:

	// Note: untested code
	mixin template imAnInputRange() {
		static assert(isInputRange!(typeof(this)));
		enum implementsInputRange = true;
	}

	struct MyInpRange {
		// This should croak loudly if this struct isn't a valid
		// input range. Omitting this line makes range functions
		// reject it too (provided we modify isInputRange as
		// described above).
		mixin imAnInputRange;

		// implement range functions here
	}


T

-- 
It only takes one twig to burn down a forest.


More information about the Digitalmars-d mailing list