Steven Watanabe wrote:
AMDG
Tobias Schwinger
writes: I don't think the comma operator is a completely fool-proof way to detect void. It is.
It could cause an ambiguity if the other type also defines an overloaded comma operator. No, because the operator is binary and one operand can have a reserved type which is only internally used by the test code.
I hope I haven't promised too much :-)...
Ok. Let's make this concrete. Here is what I imagine:
<code>
Try the attached code - does it work for you?
Regards,
Tobias
#include <iostream>
#include <cassert>
template< typename T >
struct reserved
{
char i[2];
template< typename U >
friend char operator,(T const&, reserved<U> const&);
};
#define IS_VOID(expr,target_type) \
(sizeof(( (expr) , reserved