www.digitalmars.com         C & C++   DMDScript  

digitalmars.D.learn - How to check that function gets ref parameter?

reply Andrey Zherikov <andrey.zherikov gmail.com> writes:
I'm trying to check that function has 'ref' parameter. The only 
way I found so far is to use std.traits.Parameters.

Here is the code I have:
     void f(int) {}
     void g(ref int) {}
     void main()
     {
         writeln(Parameters!f[0].stringof);
         writeln(__traits(isRef, Parameters!f[0]));
         writeln(Parameters!g.stringof);
         writeln(Parameters!g[0].stringof);
         writeln(__traits(isRef, Parameters!g[0]));
     }

The output is:
     int
     false
     (ref int)
     int
     false

"Parameters!g[0]" strips off 'ref' qualifier as you can see. How 
can I make it work?
Dec 13 2020
parent reply Basile B. <b2.tem gmx.com> writes:
On Sunday, 13 December 2020 at 16:41:06 UTC, Andrey Zherikov 
wrote:
 I'm trying to check that function has 'ref' parameter. The only 
 way I found so far is to use std.traits.Parameters.

 Here is the code I have:
     void f(int) {}
     void g(ref int) {}
     void main()
     {
         writeln(Parameters!f[0].stringof);
         writeln(__traits(isRef, Parameters!f[0]));
         writeln(Parameters!g.stringof);
         writeln(Parameters!g[0].stringof);
         writeln(__traits(isRef, Parameters!g[0]));
     }

 The output is:
     int
     false
     (ref int)
     int
     false

 "Parameters!g[0]" strips off 'ref' qualifier as you can see. 
 How can I make it work?
You use the wrong traits, try ParameterStorageClassTuple instead: void f(int) {} void g(ref int) {} import std.traits : ParameterStorageClass, ParameterStorageClassTuple; static assert(ParameterStorageClassTuple!g[0] == ParameterStorageClass.ref_); static assert(ParameterStorageClassTuple!f[0] != ParameterStorageClass.ref_);
Dec 13 2020
parent Andrey Zherikov <andrey.zherikov gmail.com> writes:
On Sunday, 13 December 2020 at 19:49:35 UTC, Basile B. wrote:
 On Sunday, 13 December 2020 at 16:41:06 UTC, Andrey Zherikov 
 wrote:
 You use the wrong traits, try ParameterStorageClassTuple 
 instead:

   void f(int) {}
   void g(ref int) {}
   import std.traits : ParameterStorageClass, 
 ParameterStorageClassTuple;
   static assert(ParameterStorageClassTuple!g[0] == 
 ParameterStorageClass.ref_);
   static assert(ParameterStorageClassTuple!f[0] != 
 ParameterStorageClass.ref_);
This works. Thanks!
Dec 14 2020