class variant
{
char d_var[80];
public:
variant() { d_var[0] = 0; }
variant(int a) { sprintf(d_var, "%d", a); }
variant(LPCSTR var) { strcpy(d_var, var); }
operator LPCSTR() const { return d_var; }
};
string operator ,(const variant &var, const string &arg) { return var; }
void void_func() {}
struct PrintHelper
{
operator string() const { return "void"; }
} printHelper;
void print(LPCSTR title, const string &result)
{
printf("expression \"%s\" evaluates to \"%s\"\n", title, result.c_str());
}
#define M(expr) print(#expr, (expr, printHelper))
void f9()
{
int a=2, b=3;
M(10);
M(a+1);
M(void_func());
M(swap(a,b));
}
It outputs to:
expression "10" evaluates to "10"
expression "a+1" evaluates to "3"
expression "void_func()" evaluates to "void"
expression "swap(a,b)" evaluates to "void"
Now I could print an expression as well as the value it evaluates to. It supports void values and doesn't differ whether a value is evaluated to void or not.
Now I wonder in the code, why operator , doesn't work when it's defined as a class variant member function. It apparently shouldn't differ from when is defined as a self-determining operator outside of the class.