if a delegate is a fat pointer, containing the context pointer and the function pointer, why isn't it legal to have a context pointer of null, allowing any function to be viewed as a delegate? It will save lots of effort, making duplicates of code for function pointers and delegates. To resolve the problem of the hidden context parameter of the delegate function, for example, a simple test for null may be used to determine whether the context pointer should be passed or not.
There is already a library solution: http://www.d-programming-language.org/phobos/std_functional.html#toDelegate