On Friday, 1 August 2014 at 11:55:02 UTC, Tudor Berariu wrote:
On Friday, 1 August 2014 at 10:34:02 UTC, Rene Zwanenburg wrote:
On Friday, 1 August 2014 at 10:25:39 UTC, Tudor Berariu wrote:
Is it possible to compare at compile time an element from a
TypeTuple with another type?
This code fails:
alias T = Tuple!(int, bool);
static assert(is(T[0] == int));
Error: static assert (is(Tuple!(int, bool)[0] == int)) is
false
Tudor
Tuple is not a type tuple, it's a runtime tuple. TypeTuple is
located in std.typetuple. Use that and your code will work.
Thank you! That works indeed, but my problem is actually a bit
different.
I called that a "TypeTuple" because I read this line in the
documentation "If a tuple's elements are solely types, it is
called a TypeTuple" (http://dlang.org/tuple.html).
What I want to achieve is something like this:
template isNeededType(T) {
enum bool isNeededType = is(T[0] == int);
}
...
enum auto t = Tuple!(int, bool)(3, false);
alias T = typeof(t);
static assert(isNeededType!T);
I know that "is(typeof(t[0]) == int)" works for the above
example, but I need to get, if possible, the types of the
elements from the type of that tuple only.
In addition to what John Colvin posted, I'd like to add that user
defined types have a 'tupleof' property. (This is yet another
kind of tuple, sigh).
An example:
struct S1
{
int i;
string s;
}
struct S2
{
int someInt;
string someString;
}
void main()
{
// A foreach loop over these kind of tuples is always expanded
during
// compilation due to their nature
foreach(T; typeof(S1.tupleof))
{
// Here 'T' _is_ a type, not an instance of a type
pragma(msg, T); // Will print 'int' and 'string' during
compilation
}
S1 s1;
S2 s2;
// A way to copy one struct's values over to another of a
different type,
// but with the same layout:
foreach(i, value; s1.tupleof)
{
s2.tupleof[i] = value;
}
}