On 03/06/2015 08:04 AM, Benjamin Thaut wrote:
On Friday, 6 March 2015 at 15:36:47 UTC, anon wrote:
Hi,
I can't figure this out.
struct Pair(T)
{
T x;
T y;
alias x c;
alias y r;
}
What would like is that the x and y to be initialized to different
values depending on type eg:
struct Container
{
Pair!double sample1; // This will initialize sample1 with 0 for both
x and y
Pair!int sample2; // This will initialize sample2 with 1 for both
x and y
}
currently I'm using two different struct one with doubles and the
other with ints and initialized with default value but was wondering
if its possible to do the above.
anon
struct Pair(T)
{
static if(is(T == int))
enum int initValue = 1;
else
enum T initValue = 0;
T x = initValue;
T y = initValue;
alias x c;
alias y r;
}
Perhaps less cluttered:
enum PairInitValue(T : int) = 1;
enum PairInitValue(T : double) = 0;
struct Pair(T)
{
T x = PairInitValue!T;
T y = PairInitValue!T;
alias x c;
alias y r;
}
And an overengineered solution: :p
import std.typetuple;
alias PairInitValues = TypeTuple!(
int, 1,
double, 0,
);
string makePairInitValueDefinitions()
{
import std.string;
string result;
foreach (i, e; PairInitValues) {
static if (i % 2 == 0) {
// This is a type
result ~= format(`enum PairInitValue(T : %s) = `, e.stringof);
} else {
// this is a value
result ~= format(`%s;`, e);
}
}
return result;
}
mixin (makePairInitValueDefinitions());
struct Pair(T)
{
T x = PairInitValue!T;
T y = PairInitValue!T;
alias x c;
alias y r;
}
unittest
{
auto p = Pair!int();
assert(p.x == 1);
assert(p.y == 1);
}
unittest
{
auto p = Pair!double();
assert(p.x == 0);
assert(p.y == 0);
}
void main()
{}
Ali