On Saturday, 19 September 2015 at 09:33:02 UTC, OlaOst wrote:
Here is a class with a templated opIndex method, and an attempt
to use it:
class Test
{
int[] numbers = [1, 2, 3];
string[] texts = ["a", "b", "c"];
Type opIndex(Type)(int index)
{
static if (is(Type == int))
return numbers[index];
static if (is(Type == string))
return texts[index];
}
}
void main()
{
auto test = new Test();
auto number = test[0]!int; // does not compile, syntax error
auto number = test!int[0]; // does not compile, syntax error
int number = test[0]; // does not compile, cannot deduce type
}
So it is possible to define a templated opIndex method in a
class, but is it possible to use it? If not, should it be
allowed to create templated opIndex methods?
2 approaches:
1) use a function instead. E.g. test.get!int(0); isn't too bad
2) If you really want to use [], do something like this:
class Test
{
int[] numbers = [1, 2, 3];
string[] texts = ["a", "b", "c"];
private struct Idx(T)
{
T data;
auto opIndex(size_t index)
{
return data[index];
}
}
auto idx(Type)() @property
{
static if (is(Type == int))
return Idx!(int[])(numbers);
static if (is(Type == string))
return Idx!(string[])(texts);
}
}
void main()
{
auto test = new Test();
auto number = test.idx!int[0];
auto text = test.idx!string[0];
}