On Tuesday, 19 July 2016 at 16:59:48 UTC, Lodovico Giaretta wrote:
On Tuesday, 19 July 2016 at 16:50:56 UTC, Rufus Smith wrote:
On Tuesday, 19 July 2016 at 16:09:38 UTC, Lodovico Giaretta wrote:
[...]

But this doesn't create a function with all the attributes of the original? Just one that has the same return type and parameters. What if Fun is pure or extern(C) or some other attributes? I'd like to create a function that is exactly the same in all regards as the original.

Sorry, I misunderstood your question.
With the method I showed you, if the function is @safe, pure, @nogc or nothrow, foo will infer those attributes. But only if the operations you do in foo (apart from calling bar) are themselves @safe, pure, @nogc or nothrow. For other things, like extern(C), I don't think there's a simple solution; but I'm not an expert, so I hope someone else will give you a better answer.

What is strange is I cannot even pass an extern(C) function to foo.

void foo(R, A...)(R function(A) bar);

extern(C) void bar();

foo(&bar)

fails. Remove extern and it passes. I have not figured out how to allow for extern(C) functions to be passed.

Reply via email to