How to distinguish a delegate from a function?
Moritz Warning
moritzwarning at web.de
Mon Jul 14 11:54:15 PDT 2008
On Sun, 13 Jul 2008 09:42:59 -0400, Matthias Walter wrote:
> Moritz Warning Wrote:
>
>> On Sun, 13 Jul 2008 03:38:36 +0200, Oliver Dathe wrote:
>>
>> > This works here:
>> >
>> > template isCallableStatically(T)
>> > {
>> > static if (is(T==function) || is(typeof(*T)==function))
>> > const bool isCallableStatically = true;
>> > else static if (is(T==delegate))
>> > const bool isCallableStatically = false;
>> > else static assert (false);
>> > }
>> >
>> > template isCallableStatically(alias T) {
>> > const isCallableStatically = isCallableStatically!(typeof(&T));
>> > }
>> >
>> > void fn() {}
>> >
>> > void main()
>> > {
>> > void dg() {}
>> >
>> > static assert (isCallableStatically!(fn)); static assert
>> > (!isCallableStatically!(dg)); static assert
>> > (isCallableStatically!(typeof(&fn))); static assert
>> > (!isCallableStatically!(typeof(&dg)));
>> > }
>>
>> Doesn't work for A.bar and A.foo (where foo is static and therefore
>> don't need an object)
>
> I had this problem some months ago and found a solution: You can extract
> the information, whether a function given as a template alias parameter
> is static or not, from the mangle of it. Currently, I'm developing a
> Compile-Time-Function-Execution- and Template-Metaprogramming- Utils
> library. The first goal after some string-parsing routines is a
> compile-time demangler which will then also be able to extract this
> information. But I guess, I'll stillt need some weeks for this. When I'm
> done, I'll create a dsource projects and announce it on the news.
>
> best regards
> Matthias Walter
Great! I'm looking forward to make use of the solution.
More information about the Digitalmars-d
mailing list