On 10/01/2015 03:26 PM, Nordlöw wrote:
On Thursday, 1 October 2015 at 02:06:48 UTC, Fusxfaranto wrote:
/** Returns: true iff all values $(D V) are the same. */
template allSame(V...) // TODO restrict to values only
{
static if (V.length <= 1)
enum bool allSame = true;
else
enum bool allSame = V[0] == V[1] && allSame!(V[1..$]);
}
std.traits to the rescue!
http://dlang.org/phobos/std_traits.html#isExpressions
Using isExpressions!V as a template constraint looks like the behavior
you're looking for.
Thanks!
BTW: Is there some way to turn the recursive definition of `allSame`
template allSame(V...)
if (isExpressions!(V))
{
static if (V.length <= 1)
enum allSame = true;
else
enum allSame = V[0] == V[1] && allSame!(V[1..$]);
}
into an iterative definition?
Very quickly:
import std.traits;
template allSame(V...)
if (isExpressions!(V))
{
bool impl_(V...)() {
static if (V.length > 1) {
foreach (i, _; V[0 .. $ - 1]) {
if (V[i] != V[i + 1]) {
return false;
}
}
return true;
} else {
return true;
}
}
enum allSame = impl_!V();
}
unittest
{
static assert( allSame!());
static assert( allSame!(42));
static assert( allSame!(42, 42, 42));
static assert(!allSame!(42, 43, 42));
}
Ali