Am Fri, 12 Sep 2014 17:57:39 +0000
schrieb "Marc Schütz" <schue...@gmx.net>:

> How about
> 
>      try {
>          my_cpp_func();
>      } catch(CppException!(const(char)*) e) {
>          writeln(e.payload.fromStringz());
>      }
> 
> ?
> 
> Btw, how does implicit conversion work with `catch` in C++? I.e., 
> if you throw a `char*`, will it be caught when you catch `const 
> char*`? This can not be handled easily with such a template, as 
> we would need to catch both `CppException!(const(char)*)` and 
> `CppException!(char*)`.

No, let's just stick to 1) please :p

Not only const(char) vs. char might be an issue because C's
const doesn't match D's const exactly, but also char can be
defined to be literally anything that can hold at least 8 bits.

http://msdn.microsoft.com/en-us/library/0d294k5z.aspx
http://www.cplusplus.com/reference/climits/
http://en.wikipedia.org/wiki/C_data_types

I know this argument could be made about interfacing with C++
in general, but in case of throwing we do not replicate the
structure of the C++ side in D as we would do with
declarations of structs and classes, so the types would be
thrown from C++ and end up "raw" in D.

I think this requires at least a D compiler flag to name the
C++ compiler eco system to emulate: e.g. MSVC++, ICC, DMC, GCC.
With that information you could then
catch(what_the_c_compiler_understands_by_a_const_unsigned_char_ptr)
or
catch(what_the_c_compiler_understands_by_a_const_signed_char_ptr)
NOT possible:
catch(what_the_c_compiler_understands_by_a_const_char_ptr),
because that would have been remapped by the C++ compiler to
either one of the former (I think).
The raw void* exception data for C char* may be presented inside
the catch block as byte*, ubyte*, ushort* or whatever is known
to match the C compiler specified on the command line.
(I hope my assumption about how C++ compilers mangle exception
 types is not too far off.)

-- 
Marco

Reply via email to