Best Way to Pass Template Typed Alias Parameters for Functions?

Alex sascha.orlov at gmail.com
Sun Dec 23 18:31:24 UTC 2018


On Sunday, 23 December 2018 at 18:13:25 UTC, Vijay Nayar wrote:
> I've been playing with the idea of specifying the constraints 
> or using "static assert" in the constructor. They are good 
> options, but there's a few cases where they fall a bit short.  
> For example, imagine you have a container class that needs a 
> comparator function to be able to compare the items in the 
> container.  While you can use std.traits to assure the right 
> kind of function is passed in, that information does not make 
> its way into the type system.
>
> For example, if you have a const function in your container 
> like "T find() const", and this function needs to use that 
> comparator, then you're out of luck because the compiler 
> doesn't know that the comparator function is const and will not 
> modify the objects being compared.
>
> Last time I ran into this problem, my solution was simply to 
> give up on const. But now I'm running into it again and trying 
> to think through it again before giving up again.

Hm... still not sure... ;)
This would compile and run:

´´´
import std.experimental.all;

size_t myHashFunction(int a) { return cast(size_t) a; }

void main()
{
	auto b = new B!(int, myHashFunction);
	b.arr = 42.iota.array;
	assert(b.find == 1);
}

class B(T, alias HashF)
{
	T[] arr;

	T find() const
	{
		foreach(el; arr)
		{
			if(HashF(el))
			{
				return el;
			}
		}
		assert(0);
	}
}
´´´


More information about the Digitalmars-d-learn mailing list