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