> The ugly solution would be to do this: > void test (ref int a) { } > void main () { writeln(typeof(&test).stringof); } > Which will print: "void function(ref int a)" and then parse out what you need.
If you're referring to using mixin() to parse the signature, I've already thought of that, but it won't work because if the type of any parameter is a user-defined type, it will be inaccessible outside the module that provides this facility. This feature will require compiler and/or language modification(s); I don't believe you can add the storage-class feature correctly with the current language (though please correct me if I'm wrong). > Let me see if I get this straight (correct me if I'm wrong in understanding > this). > So you mean we would have e.g. ref as a type constructor: ref int x; Yes. > The problem with this is that now you're functions look like this: > foo(int x) { } No... why? ref would be just like const -- so your parameter's data type could be ref(const(string)). Why do you say the functions remove the type constructor from the header? [This is a bit unrelated, but while we're on the topic of documenting code through ref/out: I think it would be better if the language required the "ref" and "out" keywords on passing the parameters, like C# does... it prevents a lot of bugs that can happen when a function's header is changed, since now the caller code won't compiler, instead of compiling but working potentially incorrectly.) I actually noticed a different problem with treating storage classes as type constructors: while "ref" and "lazy" would work well, "out" would make no sense as a type constructor, so this solution probably won't work at all. Does anyone have any ideas on how to get storage classes to work correctly with ParameterTypeTuple, whether or not it's a dirty solution (so long as the solution works)?