How to know if opSlice is defined for a type (including built-in types)?
Rikki Cattermole via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Wed Jan 20 02:44:36 PST 2016
On 20/01/16 11:41 PM, chardetm wrote:
> Hi everyone,
>
> I was wondering if it was possible to know at compile time if opSlice is
> defined for a type, including built-in types like "string". Here is the
> code I have:
>
>
> import std.stdio;
>
> struct Test {
> Test opSlice(size_t i, size_t j) {
> return this; // We don't care what it returns
> }
> }
>
> void main () {
> string s = "Hello";
> auto s2 = s[0..2];
> static if (is(typeof(&string.opSlice))) writeln("Ok string");
>
> Test t;
> auto t2 = t[0..2];
> static if (is(typeof(&Test.opSlice))) writeln("Ok Test");
> }
>
> Output:
> Ok Test
>
>
> How to make it work for "string" too (if possible)? And is there a way
> to differentiate "opSlice()" from "opSlice(size_t, size_t)" (or
> "opSlice(T, T)" for any T)?
>
> Thank you in advance!
template CanSlice(T) {
enum CanSlice = __traits(compiles, {T t; auto v = t[0 .. 1];}) ||
__traits(compiles, {T t; auto v = t.opSlice();});
}
Should work.
More information about the Digitalmars-d-learn
mailing list