digitalmars.D.learn - Testing template parameter has given API
- NaN (16/16) May 15 2020 Howdy, any idea what Im doing wrong? Given a type T i want to
- Adam D. Ruppe (2/2) May 15 2020 try changing delegate to function, on the type itself it is often
- Paul Backus (9/25) May 15 2020 Rather than trying to inspect the function itself, it's easier to
- NaN (2/11) May 16 2020 That fixed it. Thanks.
Howdy, any idea what Im doing wrong? Given a type T i want to
test the presence of certain methods. I looked in phobos to see
how isInputRange was defined but it didnt really help as all the
methods have no parameters and it used some weird lamda stuff i
think.
template isPathType(T)
{
alias FloatType = ReturnType!(T.x);
enum isPathType = (isFloatOrDouble!(FloatType)
&& (is(typeof(&T.x) == FloatType delegate(size_t idx)))
&& (is(typeof(&T.y) == FloatType delegate(size_t idx)))
&& (is(typeof(&T.cmd) == PathCmd delegate(size_t idx)))
&& (is(typeof(&T.points) == Point!FloatType
delegate(size_t idx)))
&& (is(typeof(&T.length) == size_t delegate())));
}
May 15 2020
try changing delegate to function, on the type itself it is often function
May 15 2020
On Saturday, 16 May 2020 at 01:11:54 UTC, NaN wrote:
Howdy, any idea what Im doing wrong? Given a type T i want to
test the presence of certain methods. I looked in phobos to see
how isInputRange was defined but it didnt really help as all
the methods have no parameters and it used some weird lamda
stuff i think.
template isPathType(T)
{
alias FloatType = ReturnType!(T.x);
enum isPathType = (isFloatOrDouble!(FloatType)
&& (is(typeof(&T.x) == FloatType delegate(size_t idx)))
&& (is(typeof(&T.y) == FloatType delegate(size_t idx)))
&& (is(typeof(&T.cmd) == PathCmd delegate(size_t idx)))
&& (is(typeof(&T.points) == Point!FloatType
delegate(size_t idx)))
&& (is(typeof(&T.length) == size_t delegate())));
}
Rather than trying to inspect the function itself, it's easier to
check that the result of *calling* the function is what you
expect it to be. So, for example:
is(typeof(T.x(size_t.init)) == FloatType)
The above checks to see whether, when you call T.x with a size_t
argument, you get a FloatType back. If you write your checks this
way, it doesn't matter whether T.x is a function, a delegate, or
even a template.
May 15 2020
On Saturday, 16 May 2020 at 02:02:47 UTC, Paul Backus wrote:
On Saturday, 16 May 2020 at 01:11:54 UTC, NaN wrote:
Rather than trying to inspect the function itself, it's easier
to check that the result of *calling* the function is what you
expect it to be. So, for example:
is(typeof(T.x(size_t.init)) == FloatType)
The above checks to see whether, when you call T.x with a
size_t argument, you get a FloatType back. If you write your
checks this way, it doesn't matter whether T.x is a function, a
delegate, or even a template.
That fixed it. Thanks.
May 16 2020









Adam D. Ruppe <destructionator gmail.com> 