Template elegance?
anonymous via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Jun 3 02:56:23 PDT 2015
On Wednesday, 3 June 2015 at 09:10:22 UTC, David Monagle wrote:
> What I was looking for is a more elegant way of defining those
> secondary functions. Originally I was hoping I could do
> something like:
>
> enum shouldEqual(E, V) = shouldValue((e, v) => e == v, "equal",
> E, V);
Here you go:
----
template shouldValue(alias operation, string description)
{
bool shouldValue(E, V)(lazy E expression, V value, string
name="Value",
string file = __FILE__, typeof(__LINE__) line = __LINE__)
{
if (operation(expression, value)) return true;
throw new Exception(format("%s should %s %s, but was
actually %s",
name, description, value, expression), file, line);
}
}
alias shouldEqual = shouldValue!((e, v) => e == v, "equal");
alias shouldBeGreaterThan = shouldValue!((e, v) => e > v, "be
greater than");
----
The trick is to split `shouldValue` into two nested templates.
The outer template has those parameters that cannot be deduced:
`operation` and `description`.
The inner template has the parameters that should be deduced: `E`
and `V`.
More information about the Digitalmars-d-learn
mailing list