scope(exit) without exception handling?

H. S. Teoh hsteoh at quickfur.ath.cx
Wed May 16 14:09:36 PDT 2012


On Wed, May 16, 2012 at 10:54:26PM +0200, Mehrdad wrote:
[...]
> Haha maybe, idk. I just wrote what I wrote so that I could use it
> like:
> 
> noThrow({
> 	// giant block of code
> });
> 
> 
> to execute it as nothrow.

Whoa, this code works:

	import std.math;
	import std.stdio;

	T funcWrap(T,U...)(scope T function(U) f, U args) {
		writeln("Calling wrapped function");
		scope(exit) writeln("Wrapped function returned");

		return f(args);
	}

	void printInt(int x) {
		writeln(x);
	}

	float computeFloat(float x, float y) {
		return x^^2 + y;
	}

	void main() {
		funcWrap(&printInt, 12345);
		writeln("Result is: ", funcWrap(&computeFloat, 3.0f, 1.5f));
	
		funcWrap({
			writeln("Inside an anonymous delegate");
		});

		funcWrap((int x) {
			writeln("Delegate with parameter: ", x);
		}, 100);
	}

Output:

	Calling wrapped function
	12345
	Wrapped function returned
	Calling wrapped function
	Wrapped function returned
	Result is: 10.5
	Calling wrapped function
	Inside an anonymous delegate
	Wrapped function returned
	Calling wrapped function
	Delegate with parameter: 100
	Wrapped function returned

OK, this isn't the same as your nothrow wrapper, but the principle is
the same. The funcWrap template can basically call _any_ function that
returns _anything_.

D just acquired whole new levels of cool for me. :-)


T

-- 
ASCII stupid question, getty stupid ANSI.


More information about the Digitalmars-d mailing list