On Monday, 3 August 2015 at 13:54:51 UTC, HaraldZealot wrote:
On Monday, 3 August 2015 at 13:13:55 UTC, Andrea Fontana wrote:
Why don't you use templates? Something like:
enum ValueType
{
Init,
Min,
Max
}
auto exampleValues(T)()
{
T[ValueType] retVal;
retVal[ValueType.Init] = T.init;
static if (__traits(compiles, T.min)) retVal[ValueType.Min] =
T.min;
static if (__traits(compiles, T.max)) retVal[ValueType.Max] =
T.max;
return retVal;
}
exampleValues!int.writeln;
exampleValues!string.writeln;
Good solution!
But there is something that not perfect: it can be customizable
only with template specialization as I see. I want not only
standard values like `init` `max` or `min` but also some
example value like 1, 2, 3, 4, 5 for `int`. In last case your
template solution not so convenient as desired (introduction in
language feature like `.testValue1` seems ridiculous, and
without that only template specialization can provide
customization, as I have said).
But this seems interesting direction, and easy to implement in
object.d (without library implementation, this feature have
little benefit).
You have to write the same amount of code.
It's just one line for each type... Something like:
import std.traits;
enum ValueType
{
Init,
Min,
Max
}
auto exampleValues(T)()
{
T[ValueType] retVal;
retVal[ValueType.Init] = T.init;
static if (__traits(compiles, T.min)) retVal[ValueType.Min] =
T.min;
static if (__traits(compiles, T.max)) retVal[ValueType.Max] =
T.max;
static if(isIntegral!T) return tuple!("defaults",
"customs")(retVal, [1,2,3,4,5]);
else static if(isFloatingPoint!T) return tuple!("defaults",
"customs")(retVal, [1.0,2.0,T.nan]);
else static if(isSomeString!T) return tuple!("defaults",
"customs")(retVal, ["hello", "world"]);
else return tuple!("defaults", "customs")(retVal, T[].init);
}